C++笔记

一、struct 和 class 用法一样,结构体成员变量默认为公有,类默认为私有

二、栈,堆和全局数据区都可创建对象,栈中成员变量的初始值为随机值,无论在哪创建对象都会调用构造函数

三、类的定义和声明是不同的

四、自动匹配调用构造函数,初始化要调用构造函数

五、定义(赋值)和初始化不同

六、编译器为我们提供默认的无参构造函数和拷贝构造函数的条件

七、初始化列表的使用,初始化的顺序跟成员的声明顺序相关,成员变量只能通过初始列表进行初始化

八、const成员变量本质是只读变量,只能通过初始化列表赋值,可以通过指针改变值

九、goto关键字改变程序的执行流

十、全局对象的构造顺序是不确定的

十一、free函数只是一个普通的函数,必须显示的调用

十二、析构函数不能被重载

十三、临时对象的生命周期只有一条语句的时间

十四、编译器会进行优化,尽量避免临时对象的产生

十五、析构函数的调用顺序,类似于出栈入栈

十六、const也能修饰对象和成员函数,const只读对象只能调用const成员函数

十七、函数只能位于代码段,所以所有对象共享一套成员函数,成员函数有个特殊的this指针参数,用于指向当前对象,成员函数可以访问任意类对象的成员变量

十八、静态成员变量,需要在类外单独分配空间,位于全局数据区,需要在类外使用类名分辨符进行定义和初始化

十九、静态成员函数不隐含this指针

二十、构造函数不能保证初始化逻辑完成,半成品对象

二十一、友员直接破坏了面向对象的封装性

二十二、函数重载发生在同一个作用域中,全局函数和成员函数不能构成重载

二十三、操作符的重载,优先在成员函数匹配,全局函数和成员函数都可以实现操作符的重载,返回对象的引用(会生成临时对象)

二十四、函数参数的默认值在函数定义的时候指定就行

二十四、赋值操作符只能通过成员函数实现

二十五、字符串和数字的转换,宏:#define TO_NUMBER(s,n) (istringsteam(s) >> n)

#define TO_STRING(n) (((ostringstream&)(ostringstream()<<n)).str())

二十六、函数对象,重载()符号,重载函数调用操作符,用于取代函数指针

二十七、编译器默认为每个类重载了赋值操作符,只是进行浅拷贝

二十八、编译器默认提供:构造函数,析构函数,拷贝构造函数,赋值操作函数

二十九、智能指针的实现重载 * 和 -> 操作符,智能指针智能指向堆空间中的对象或者变量

三十、函数参数的计算顺序是不定的,所以重载逻辑操作符有陷阱

三十一、逗号表达式是最后一个表达式的值,重载逗号操作符必须有一个类类型参数,返回的是引用,工程中不要重载逗号操作符

三十二、类类型的前置后置++,前置比后置效率更高

三十三、转换构造函数:有且仅有一个参数,参数是基本类型,参数是其他类类型

三十四、exlicit 避免隐式的强制类型转换,转换构造函数 static_cast, 自定义类型转换函数,类型转换函数可能与转换构造函数冲突,Type toType()代替类型转换函数

三十五、组合关系,之类是一个特殊的父类,之类对象可以直接初始化父类对象,子类对象可以直接赋值给父类对象,默认为私有继承方式,C++的派生语言只支持公有继承

三十六、显示和隐式调用父类的构造函数,显示通过初始化列表调用,默认适用无参构造函数和适用默认参数的构造函数,都没有匹配上则报错,先父母,后客人,再自己,析构相反

三十七、父子间的同名覆盖,可以通过作用分辨符和父类名访问;同名函数的覆盖,不能重载(不在同一个作用域中),作用域分辨符解决

三十八、父子兼容:子类对象可以直接赋值给父类对象,子类对象可以直接初始化父类对象,父类指针可以直接指向子类对象,父类引用可以直接引用子类对象,子类退化为父类后只能访问父类的成员和函数,不存在同名覆盖了,特殊的同名函数(函数重写),编译期间,编译器只能根据指针的类型判断所指的对象

三十九、virtual 对多态进行支持,具有多态性,可以继承,只写一遍virtual ,函数重写必须实现多态,静态联编(函数重载),动态联编(函数重写)

四十、reinterpret_cast<B*>(&a):重新解释一段内存空间,运行时对象退化为结构体形式,访问权限在运行时失效,C++成员函数调用时隐藏传递了对象指针,成员变量和函数是分开存放的

四十一、C++继承的对象模型,虚函数表,存在虚函数时,每个对象都有一个指向虚函数表的指针,因此虚函数会牺牲一定的效率,虚函数表指针放在最开始的四个字节处,继承成员变量的叠加

四十二、抽象类只能被继承,C++没有抽象类,通过特殊的虚函数(纯虚函数),抽象类不能定义对象,但是可以定义指针

四十三、接口:没有定义任何成员变量,所有函数都是公有的,所有成员函数都是纯虚函数。C++中是一种特殊的抽象类

四十四、C++支持多重继承,多重继承可能拥有不同的地址,但指向的是同一个对象;多重继承可能产生冗余的成员,虚继承可以解决数据冗余,但中间层父类不在关心顶层父类的初始化,最终子类必须直接调用顶层父类的构造函数,一般在工程中不使用多重继承

四十五、多重继承可能产生多个虚函数表,新型的强制类型转换方式:dynamic_cast<BaseB*>(pa) 进行指针的修正,使用时要求类中必须有虚函数,指针转换失败返回空指针,引用转换失败则发生操作异常;单继承加实现多接口的开发方式

四十六、构造函数不可能成为虚函数,在构造函数执行结束后,虚函数表指针才会被正确的初始化,析构函数可以成为虚函数,建议设计成虚函数(因为可能跳过子类的析构函数)

四十七、构造函数和析构函数中不能发生多态行为(调用其他函数),只调用当前类中定义的函数版本

四十八、函数模板的使用:自动推导,显示调用

四十九、函数分:成员函数,静态函数,构造函数,析构函数

五十、构造函数不属于成员函数

五十一、const成员变量只能调用const成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值