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

来源:互联网 发布:linux安转vnc 编辑:程序博客网 时间:2024/06/05 11:23

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 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 煮鸡蛋滚脸有什么好处 滚鸡蛋的方法 滚齿机 滚齿机价格 数控滚齿机 y38滚齿机 滚齿机多少钱一台 滚齿机厂家 大型滚齿机 二手数控滚齿机 二手滚齿机转让 滚齿机加工原理 滝川惠理中文中字 滞涨是什么意思 股市王亚伟 取消粘滞键 滞纳金 滞纳金是什么意思 违章滞纳金 滞纳金怎么算 物业费滞纳金 交通罚款滞纳金 罚款滞纳金 滞纳金的法律规定 违章滞纳金怎么算 信用卡滞纳金 税款滞纳金 物业滞纳金 社保滞纳金怎么算 社保滞纳金 上海违章滞纳金 交通违章滞纳金 暖气滞纳金 信用卡逾期滞纳金 水费滞纳金怎么算 契税滞纳金怎么算 物业费有滞纳金吗 什么是滞纳金 银行滞纳金怎么算 滞纳金计算 滞纳金是什么