By using this site, you acknowledge that you have read and understand our Cookie policy, Privacy policy and Terms .
access_time 10 years ago visibility442 comment 0 language中文

这几天正在学习C++(非托管,无特别说明以下的C++均指非托管的C++,而非CLR C++),为了快速的学习和加深印象,我对照VB、C#来学习,通过对比他们的相同与不同处达到融会贯通的目的,以下是一些总结或者注意点,希望对其他C++(尤其是之前学习C#)的新手提供一些参考。

我目前的学习资料是《Sams Teach Yourself C++ in One Hour a Day》英文版第六版,相关表述参照了其中的内容,并且以我自己的理解和语言进行描述,不准确的地方请见谅。

1,string即char数组,以'\0'即空字符结尾,如长度为16的字符串可以包含15个字符以及一个空字符;处理字符串有string类型,可以通过strcpy以及strncpy,strcat等函数操作字符串,与C语言类似;在通过std::cin读取字符串的时候尤其应注意空字符,可以通过设定读取长度等解决。

2,指针与C语言类似,在定义以后,应注意将其初始值设置为空指针即0,避免造成相关错误。

3,定义的数组变量即为指向数组第一个元素的指针,可以通过指针方便的操作数组,比如*(数组变量+1)即可获得一个元素的值;应注意区分数组变量指针以及指针类型的数组。

4,内存可以简单的有五个划分:Global namespace、the free store,Registers,Code space,the stack(后进先出);分别用于存储全局变量,局部变量以及方法参数,寄存器数据读取非常快,用于内部维护,比如记录stack的顶部以及命令指针等,code space 用于存储方法代码本身,其余的就是heap;指针可以用于方边操作free store即heap以及类的成员,还可以引用传值等;

5,通过new关键字可以分配heap空间,返回的是指针类型,该指针指向创建的对象;应注意当内存不足的情况,无法分配heap的时候,将返回空指针。

6,在C++中,定义一个变量,运行时即会在stack中为其分配相应的内存空间,无论是class类变量,还是builtin的变量;而在C#中,引用类型的变量如Object类,在实例化后直接在Heap上为其分配内存空间。

SimpleCat myCat; //C++中此处即会创建一个SimpleCat的变量,调用其默认构造函数

7,heap不会自动回收,为了避免内存泄露memory leak,应使用delete关键字回收该内存,一般在类中通过构造函数中初始,然后在析构函数中删除;执行delete后应该将指针设置为0,避免造成再次使用此指针造成程序崩溃等;在C#中,一般我们主要注意非托管资源的释放,而GC可以自动的回收不再使用的内存。

8,C++中的reference是引用,通过 &变量名=变量 的形式进行定义,&reference地址为实际指向变量的地址,reference变量不能够重新复制,只会将新的值赋值给之前的变量,并不会改变引用的地址这和C#中的引用类型不同,以及C++中的指针是可以重新赋值的;reference相当于是一个别名不能为空,而指针可以为空指针,通过这两种方式在函数之间船只类似于C#的ref和out关键字所起作用;在引用传值的时候应尽量使用reference的方式,它更易于理解。

9,虽然可以方便的通过指针进行传值,由于指针暴露了变量在内存中的真实地址,所以是很危险的操作,为了避免被更改,可以使用指向常量的指针,以及指向常量的常量指针来避免在其他函数中被更改的危险;同时应注意区分指向常量的指针以及常量指针,常量指针不能再为指针赋值。

10,C++的很多运算符和C#等比较的类似,不过应注意*以及&等操作运算符的多重含义;循环控制语句等也和C#类似。

11,C++中应注意养成良好的代码书写习惯,同时应注意方法定义declare与方法实现definition的区别,这点习惯了C#的程序员可能最初的时候不会太适应,而且还会遇到 方法吗 not define or found in the scope等编译时的错误。

在我不断的学习过程中,我会不断的更新这篇文章,最后再附上一个Win32的Hello World的 C++版本例子(IDE使用的VS2010)。

#include "iostream"

//methods declaration
void helloWorld();
char pause();

int main()
{
    helloWorld();
    pause();
    return 0;
}

//methods definition
void helloWorld()
{
     using namespace std;
     cout<<"Hello World!"<<endl;
}
char pause()
{
    using namespace std;
    cout <<endl << "Please input any charactor to exit." << endl;
    char c;
    cin >>c;
    return c;
}


info Last modified by Raymond at 10 years ago * This page is subject to Site terms.

More from Kontext

visibility 6364
thumb_up 0
access_time 5 years ago

In this post, I am going to demonstrate how to use Eclipse to create and debug C/C++ programs for Unix/Linux in Windows. I am going to use Cygwin GCC as toolchains. Cygwin GDB will also be installed for debugging purpose. I am using Windows 10 and JRE 1.8 in the following steps. Install E...

open_in_new View open_in_new C and C++

visibility 712
thumb_up 0
access_time 9 years ago

本文阐述C/C++与C#的不同点,从数据结构与类型,关键字,语法结构,面向对象等角度出发,不涵盖所有不同点。

open_in_new View open_in_new C and C++

info About author

Kontext dark theme mode

Dark theme mode

Dark theme mode is available on Kontext.

Learn more arrow_forward
Kontext Column

Kontext Column

Created for everyone to publish data, programming and cloud related articles. Follow three steps to create your columns.

Learn more arrow_forward
info Follow us on Twitter to get the latest article updates. Follow us