细说C++中那些容易忽略而又非常重要的知识点

C++基础重要知识点:
1、C++对C语言的加强之register关键字:
①、C语言中register关键字请求编译器对局部变量存储在寄存器中,无法取到register变量的地址;
②、C++中依然支持register关键字,C++编译器有自己的优化方式,不使用register也能做优化处理,C++中可以取到register变量的地址;
③、由于早期的编译器不会对代码进行优化编译处理,所以register变量是个很好的补充;
2、C++对C语言的加强之变量定义:
①、C语言中,重复定义多个同名的全局变量是合法的,并且他们最终会被连接到同一个地址空间;
②、C++直接拒绝这种二义性的变量定义方式;
③、C++强调实用性,可以在任意的地方声明变量;
3、C++对C语言的加强之const变量:
①、C语言中的const变量是只读变量,有自己的存储空间;
②、C++中的const变量是真正意义上的常量,放在常量符号表中,只有对它进行取址操作或者extern操作时才会分配内存空间;
③、C++中的const常量类似于宏定义,但是区别在于:const常量由编译器处理,提供类型和作用域的检查,而宏定义只是单纯的文本替换;
④、 在类内部的const成员变量是肯定会被分配地址空间的,因为编译器无法得到类内部const成员变量的初始值,因此无法进入符号表成为真正意义上的常量
4、C++对C语言的加强之类型:
①、C++中的所有变量和函数都必须明确的指出其类型,而C语言中的默认类型在C++中是不合法的;
5、C++对C语言加强之struct结构体:
①、C语言中的struct只是一组变量的集合,C编译器并不认为这是一种新的数据类型;
②、而C++中的struct是一种新类型的定义声明;
5、C++对C语言的加强之三目运算符:
①、C语言中的三目运算符返回的是变量值,不能作为左值使用;
②、C++中的三目运算符可以直接返回变量本身,因此可以出现在程序的任何地方;
③、 如果三目运算符的返回值有可能是常量值,则不可以作为左值来使用
6、C++中的const引用:
①、const引用让变量拥有只读属性;
②、当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名;
③、引用相较于指针来说,有更好的可读性和实用性
7、C++中引用的内部实现:
①、C++编译器在编译过程中使用 常指针 作为引用的内部实现,因此引用所占空间大小与指针相同;
8、C++函数返回值为引用:
①、若返回栈变量,不能成为其他引用的初始值(因为函数返回后栈变量地址被释放,尽量不要返回栈变量的引用),也不能作为左值使用;
②、若返回静态变量或全局变量,可以成为其他引用的初始值,也可作为左值或者右值使用(这也就解释了C++中的三目运算符可以作为左值来使用);
9、C++内联函数:
①、C++编译器直接将内联函数的函数体插入到函数调用的地方,从而也就没有了普通函数调用时的压栈、跳转、返回时的额外开销;
②、内联函数是对编译器的一种请求,编译器有可能拒绝这种请求(当压栈、跳转、返回的开销远远小于函数体本身的执行开销的时候);
③、内联函数由编译器处理,而宏代码片段由预处理器处理,没有任何编译过程;
10、C++中函数默认参数:
①、C++中可以在函数声明时为函数提供一组默认参数值,当函数调用时没有指定参数值,编译器会自动使用默认参数值;
②、一旦一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值;
③、 当函数重载遇到函数默认参数时,C++编译器直接拒绝这种二义性的函数重载方式,编译失败(返回值类型不能作为函数重载的依据)
④、 函数重载和函数指针,当使用重载函数名对函数指针进行赋值操作时,要严格匹配函数参数列表和函数返回值类型
11、C++和C的相互调用:
①、使用extern关键字强制C++编译器对代码进行C方式编译:extern "C" {xxxxxx}
②、 C++编译器不能以C编译器的方式编译多个重载函数
12、C++的动态内存分配:
①、new和delete关键字是C++语言的一部分,malloc和free是由C库函数提供的函数;
②、new以具体数据类型为单位进行内存分配,malloc只能以字节为单位进行内存分配;
③、new在申请单个类型变量时可进行初始化,malloc不具备内存初始化的特性;
④、 对于类类型new和delete还负责构造函数和析构函数的调用
13、C++中的命名空间的使用:
①、C语言所有的全局标识符共享同一个全局作用域,可能发生冲突;
②、C++命名空间将全局作用域分成不同的部分,全局作用域也叫默认命名空间;
14、C++中的强制类型转换:
①、C语言中的强制类型转换过于粗暴,任意类型之间都可以转换,编译器很难判断其正确性;
②、C++将强制类型的转换分为4种不同的类型:
static_cast:用于基本类型间的转换,不能用于基本类型和指针间的转换;用于有继承关系类对象之间的转换和类指针之间的转换;
const_cast:用于去除变量的const属性;
reinterpret_cast:用于指针类型间的强制转换,还可用于整数与指针类型间的强制转换;
dynamic_cast:
15、C++符号表:
①、符号表是C++编译器在编译过程中产生的关于源程序中语法符号的数据结构:常量表、数组名表、函数名表等等,它们是编译器自己使用的内部数据结构,并不会进入最终产生的可执行程序中;
②、被volatile修饰的const常量不会进入常量符号表,退化为只读变量;
③、 const引用的类型与初始化变量的类型相同时,使初始值变量成为只读变量,不相同时(例如int和char)生成一个新的只读变量,其初始值与初始值变量相同
16、C++中两个特殊的构造函数:
①、当类中没有定义构造函数时,编译器默认提供一个无参构造函数,其函数体为空,编译器还会默认提供一个拷贝构造函数,简单的进行成员变量的值复制;
②、当类中定义了任何非拷贝构造函数时,编译器就不再提供无参的构造函数,但是还是会默认提供一个拷贝构造函数;
17、C++初始化列表:
①、C++中提供了初始化列表对成员变量进行初始化,成员变量的初始化顺序与声明的顺序相关,而与初始化列表中的顺序无关,并且初始化列表先于构造函数的函数体执行;
18、C++中类的静态成员:
①、从名字空间的角度来看,类的静态成员只是类这个名字空间中的全局变量和全局函数,类可以对静态成员进行访问权限的限制,而名字空间不能;
②、从面向对象的角度来看,类的静态成员属于类概念本身,类的所有对象共享相同的静态成员;
③、 类的静态成员不包含隐藏的this指针
19、C++中的操作符重载:
①、操作符重载的本质是通过函数重载来扩展操作符的语义;
②、使用成员函数重载操作符要比全局函数重载操作符少一个左操作数,也不需要friend友元关键字来修饰重载函数;
③、当无法修改操作数的类时,使用全局函数进行重载,但是“=、[]、()、->”这四个操作符只能通过成员函数来重载;
④、“++”操作符通过一个int参数进行前置与后置的重载,C++中不要重载&&和||操作符;
20、C++编译器会尝试各种手段尝试让程序通过编译:
①尽力匹配重载函数;
②尽力使用函数的默认参数;
③尽力尝试调用构造函数进行类型转换;
21、C++继承中的赋值兼容性原则:
①、子类对象可以当作父类对象使用;
②、子类对象可以直接赋值给父类对象;
③、子类对象可以直接初始化父类对相;
④、父类指针可以直接指向子类对象;
⑤、父类引用可以直接引用子类对象;
22、C++中继承中的构造与析构:
①、子类对象创建时会首先调用父类的构造函数,然后执行子类的构造函数,当父类的构造函数有参数时,需要在子类的初始化列表中显示调用;
②、析构函数调用的顺序与构造函数相反;
23、C++中继承与组合的混搭:
①、构造函数的调用顺序是先父母、再客人、后自己;
24、C++中的virtual虚函数:
①、 virtual关键字是C++中支持多态的唯一方式,被重写的virtual虚函数即可表现出多态的特性
25、C++中的函数重载和函数重写的区别:
①、函数重载:必须在同一个类中进行,或者说是在同一个作用域中发生重载;子类无法重载父类的函数,父类的同名函数将被覆盖;重载是在 编译期间 根据参数类型和个数决定调用哪个函数;
②、函数重写:必须发生在父类和子类之间;并且父类和子类中的函数必须有完全相同的原型;使用virtual关键字声明之后能够产生多态;多态是在 运行期间 根据具体对象的类型来决定函数的调用;
26、C++中virtual虚函数和普通函数的区别:
①、 通过虚函数表指针VPTR调用重写函数是在程序运行时进行 的,因此需要通过寻址操作才能确定真正调用的函数,而普通函数是在编译时就确定了 调用的函数,在效率上虚函数的效率要低很多
②、 对象在创建的时候由编译器对虚函数表指针VPTR进行初始化,只有当对象的额构造完全结束后VPTR的指向才最终确定,父类对象的VPTR指向父类的 虚函数表,子类对象的VPTR指向子类的虚函数表;
③、 构造函数实现为virtual虚函数是无法实现多态的(因为子类构造时首先调用父类的构造函数,这时VPTR指向的是父类的虚函数表)
27、C++中的抽象类:
①、抽象类是一种可用于表示现实世界中的抽象感念,只能定义类型而不能用于定义对象的类,只能被继承并重写相关函数,抽象类的直接特征就是 纯虚函数(一种只声明函数原型而故意不定义函数体的虚函数)
②、抽象类只能用于定义指针和引用;
③、抽象类中的纯虚函数必须被子类重写;
28、C++中的多重继承:
①、多重继承带来的代码复杂性远远多于其带来的便利性,而且所有的多继承都可以通过单继承实现,多继承对代码维护性上的影响 是灾难性的,所以工程中多继承几乎已经被抛弃了;
29、C++中的模板:
①、


未完待续,希望对大家有所帮助!------Powered By Anonymous--V.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值