Summary of C++

C++是面向对象的,是对C语言的扩展,同时有增强和改进了C语言中的缺陷,比如说宏和const,增加一种最重要的类型,引用类型。

在C++中名称可以是符号常量,变量,宏,函数,结构体,枚举,类和对象,为了避免在大规模程序设计中,以及在使用各种各样的C++库是,这些标识符发生冲突,引入了关键字namespace关键字,可以更好的控制标识符的作用域。std是标准命名空间,标准库的所有标识符都定义在了std中,比如说iostream,vector,等等,在使用这些的时候,出了导入对应的头文件,还要引用该命名空间using namespace std.这样才可以使用,否则回提示"XXX没有声明在这个范围内"。

这也是C和C++的区别之一,在C语言中,只有一个全局作用域,所有标识符都在这个作用域中,因此很容易发生冲突,而C++中引入了命名空间的概念之后,将全局作用域分开到了不同的部分,因此就不太容易发生名称冲突。同时命名空间还可以进行嵌套。

C和C++编译器是不一样的,提供了一下改进。

实用性增强,变量的定义不用在在文件的开头了,在文件任何地方都可以进行定义。

register关键字,是请求编译器让变量直接放在寄存器来面,速度快,在C语言中,register修饰的变量是不能取地址的,因为寄存器是没有地址的。在C++中编译器有了自己的优化,即使不使用register也可能被优化,同时在C++中可以取得register变量的地址。并不是因为寄存器可以取地址了,而是因为当C++编译器发现对一个register变量取地址了,这个变量就变成了普通变量。C语言编译器不会对代码进行优化,因此这个时候就可以使用register关键字进行强制的优化。

功能检测,全局变量定义检查更加严格。在C语言中,重复定义多个同名全局变量是合法的,在c++中不允许定义多个同名变量,C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上,可能是做了hash映射的缘故。而C++直接决绝了这种定义的方式。

struct关键字增强,C++认为是一个新的数据类型,因此不同typedef,而C语言需要使用typedef才可直接后面跟类型变量,否则要使用struct关键字开头。

变量类型检查更加严格。C语言的返回值可以不写 ,默认是void,而C++要求必须要写。

bool类型占一个字节,只有true false,要么是1,要么是0.

三目运算符,在C语言中返回的是一个值,而在c++中返回的是一个变量的自身,也就是可以当做左值来进行使用。要注意的是等号的优先级 是最低的。

所有变量和函数的定义都必须有定义,不能再试void 了。

const类型总结

const修饰的是指针变量还是修饰的是指针指向的变量空间,也就是顶层const和底层const,

C语言中的const不是真正的const,可以通过指针来间接修改变量的内存。

而C++中通过引入符号表机制,会将const修改的变量放到符号表里面,对应的是一个key value.

在编译的过程中发现了该常量,则直接进行符号表中的替换,当你对这个变量取地址的时候,编译器会给该变量分配一个新的地址空间,你修改的是这个地址空间中的值,不是符号表中的值。

C++中通过引入符号表机制 ,这一个中间层,使得对应的变量是只读的。

const还可以这样使用

const int a = 5;
const int b = 5;
int arr[a+b] = {0};

在C++这样是可以编译通过的,就是因为使用了符号表机制,使得在编译到第3行的时候,a和b都已经有值了,并且还是确定的,因此第三行才可以编译通过,这也就说明了,C++中的const是真正的const。

const和#define的区别

const是由编译器处理的,提供类型检查,作用与检查等等

宏是由预处理器处理的,仅仅是文本替换。

#define是全局的,没有作用域的概念。

C语言中的const是只读变量,有自己的存储空间

C++中的const可能分配地址空间可能不分配地址空间,这取决与你是否进行了取地址运算

当const为全局,并且常量在其他文件中使用,会分配存储空间

当使用&运算符,取const地址的时候,分配存储空间

当const int &a = 10 const修饰i引用的时候,也会分配内存空间。

在c++中const修饰类的成员变量,必须在初始化列表中进行初始化,const修饰的成员函数,修饰的是this指针。

C++中的引用

C++中可以对一个已经定义的变量取别名。

引用最常用的地方就是参数传递,可以避免大量参数的拷贝。

常量引用。通过常量引用一个变量,可以让一个变量拥有只读属性,不能通过引用变量来进行修改内存。还可以用字面值常量初始化引用。

C++对C的扩展

内敛函数 是一种请求,可能同意也可能不同意  ,具体是直接在调用的地方插入函数体,省去了调用和函数压占出栈的开销。

默认参数,默认参数的右边必须都是默认参数

函数重载,重写,重定义

重载是在同一个作用域中,函数名相同,函数参数不相同,

函数重载遇上默认参数会有二义性。

虚函数重写 是多态

重定义是子类重定义父类中的函数,名称相同。

C++类和对象

类的封装是有两层含义,一种是数据和方法进行封装,另外一个就是访问控制。

构造函数

无参构造函数,有参构造函数,默认构造函数,拷贝构造函数 。

默认构造函数 直接类型后面加上对象名称,不能加上小括号。

拷贝构造函数的3中调用时机

用另外一个对象初始化一个新创建的对象

形参拷贝

函数的返回值 C++编译器会做成一个匿名对象 如果用新建的一个对象来接受,就会将这个匿名对象转换成为这个对象,如果不是这种情况,那么这个匿名对象在这个函数作用域结束之后就消失了。

构造函数的调用规则

如果写了构造函数,那么必须使用,

当定义了拷贝构造函数,编译器不会提供无参构造函数,当类定义了任意的非拷贝构造函数,编译器不会提供默认无参构造函数。

构造函数调用的顺序,先调用组合对象的构造函数,在调用自己的构造函数,析构过程是相反的。

如果是继承,就会稍微复杂一点,先调用父类,然后是自己组合对象,最后 才是自己的构造函数,父类中的构造函数调用方法也是一致的。

静态成员变量是一种机制,使得这个变量或者是函数归所有对象所有。一般来讲,类中的函数或者是变量都是这个类对象所独有的。

由于类在创建对象的时候不包含静态成员变量,因此,静态成员变量的是不在类中的,因此需要显示的对静态成员变量进行赋值和初始化。

猜你喜欢

转载自www.cnblogs.com/randyniu/p/9243719.html