C++学习记录小结

C++学习笔记(一)

1.公有成员
类可以访问,
类对象可以访问,
通过公有继承的派生类可以访问,
通过私有继承的派生类可以访问,
通过保护继承的派生类可以访问,
通过公有继承的派生类的对象可以访问,
通过私有继承的派生类的对象不可以访问,
通过保护继承的派生类的对象不可以访问。
2.私有成员
类可以访问,
类对象不可以访问,
通过公有继承的派生类不可以访问,
通过私有继承的派生类不可以访问,
通过保护继承的派生类不可以访问,
通过公有继承的派生类的对象不可以访问,
通过私有继承的派生类的对象不可以访问,
通过保护继承的派生类的对象不可以访问。
3.保护成员
类可以访问,
类对象不可以访问,
通过公有继承的派生类可以访问,
通过私有继承的派生类可以访问,
通过保护继承的派生类可以访问,
通过公有继承的派生类的对象不可以访问,
通过私有继承的派生类的对象不可以访问,
通过保护继承的派生类的对象不可以访问。

8.函数重载分析(下)
注意:
函数重载必然发生在同一个作用域;
编译器需要用"参数列表"或"函数类型"进行函数选择
无法直接通过函数名得到重载函数的入口地址,必须借助于函数指针进行强制类型转换

extern关键字能强制让C++编译器进行C方式的编译

C++编译器的内置宏 __cplusplus

C++编译器不能以C的方式编译重载函数

9.new关键字与命名空间
new关键字与malloc函数的区别:
new关键字是C++的一部分;而malloc函数是C库提供的函数。
new以类型为单位,且可以完成初始化;而malloc函数以字节为单位,不可以完成初始化。

C语言共享一个全局域
C++ 可以命名域空间

10.新型类型转换
static_cast:用于基本类型转换,不能用于基本类型指针转换,用于有继承关系类对象之间的转换和类指针的转换
const_cast:去除变量的只读属性,强制转换的目标类型必须是指针或引用
dynamic_cast:用于有继承关系的类指针之间的转换,用于有交叉关系的类指针间的转换,具有类型检查功能,需要虚函数的支持
reinterpret_cast:用于指针类型之间的强制类型转换,用于整数和指针之间的转换

****const关键字
只有用字面量初始化的const常量才会进入符号表
使用其他变量初始化的const常量依旧是只读变量
被volalite修饰的const常量不会进入符号表
//编译期间编译器不能确定初始值的const关键字,只会当作只读变量
const修饰对象为只读对象

使用引用初始化另一个引用,如果类型不一致,会分配一个新的内存空间
例如:
char c = ‘c’;
char& rc = c;
const int & trc = c;
rc和c有相同的内存空间,而trc会另外分配内存空间

C++提供两种特殊函数:
1.默认无参构造函数(类定义是没有提供构造函数(包括拷贝构造函数))
2.默认拷贝构造函数(浅拷贝,类定义没有提供拷贝构造函数)

C++初始化列表
1.初始化类的const成员变量,在构造函数的定义之后函数体之前写初始化列表;
2.成员的初始化的顺序依赖于成员的成名顺序;(***)
3.初始化列表先于构造函数的函数体执行;
4.类中的const成员变量,是只读变量;因为编译器无法获取其初始值,将其记入符号表;

对象的构造顺序
C++中全局对象的构造顺序是不确定的,随编译器而定;

析构函数
一般当类中定义了构造函数,并且函数中使用了系统资源,需要自定义析构函数;

临时对象:(要尽量避免临时对象的产生)
直接调用构造函数将产生一个临时对象,生命周期只有一条语句
例子:Class A = Class(a); 临时对象初始化对象时,不会调用拷贝构造函数,会直接由构造临时对象赋给A,省略了拷贝构造函数,替身了效率;

所有的对象共享类的成员函数,在类的成员函数中,有一个隐藏指针this表示当前对象

静态成员变量在初始化时,需要完整的定义加初始化,例如: int Class::A = Value;

静态成员函数在被对象或类名调用时,可以直接访问静态成员变量,但不可以直接访问成员变量,需要借助于对象作为参数传入间接访问
静态成员函数和普通成员函数的区别:
所有对象共享 YES YES
隐含this指针 NO YES
直接访问普通成员变量(函数) NO YES //构造函数为特殊函数
直接访问静态成员变量(函数) YES YES
通过类名调用 YES NO
通过对象调用 YES YES

构造函数里面可以执行return语句,当执行到return语句时会直接返回;
构造函数只提供了初始化成员变量等一系列操作,并不能保证初始化逻辑一定成功,可能被return返回;
采用二阶构造可以有效避免半成品对象。

友元指的是函数与类或者类与类之间的关系,是单向的;
友元可以直接访问类的所有成员,不受到类中访问级别的限制;

重载函数本质为不同的函数
函数名和参数列表是唯一的标识
函数重载必须发生在同一个作用域内

类的静态成员函数和普通成员函数可以构成重载

类的成员函数为操作符重载函数比全局操作符重载函数少一个左操作数;
编译器有现在类的成员函数中寻找操作符重载函数

赋值操作符(=,[ ],( ),->,*)只能在成员函数内实现操作符重载,且返回值为当前对象(return *this)
操作符重载不能改变原操作符的优先级
操作符重载不能改变操作数的个数
操作符重载不能改变原有的语义

C++标准库有一个兼容了C语言库的子库
C++标准库位于std命名空间

sstream头文件,解决字符串和浮点型的转换
istringstream对象将字符串转为浮点数,例如 istingtream iss(“1212.12”); double num; iss>>num; “>>“操作符返回类型为bool
ostringstream对象将浮点数转为字符串,例如 ostringsteam oss; oss<<121.11;(等价于oss << 121 <<”.” <<11;) string str = oss.str(); "<<"操作符返回类型为oss;

函数对象:重载()操作符;函数对象用于在工程中取代指针 //智能指针

不要使用C语言中操作字符串的方式写C++代码

C++重载逻辑运算符(&& 和||)短路法则完全失效,重载无法实现原生的原有语义,工程里不建议重载逻辑操作符,可以重载比较操作符或者使用成员函数代替逻辑操作符;使用全局函数对逻辑操作符重载

C++重载逗号操作符是合法的;在全局函数中对逗号操作符进行重载;重载函数的参数必须有一个是类类型,重载函数的返回值必须是引用;重载之后原生语义会改变,从左到右的顺序会不确定了,类似于逻辑运算符重载

++/–操作符都可以通过全局函数和成员函数重载
重载前置操作符不需要额外参数;
重载后置操作符需要一个int型占位符;

转换构造函数:1.只有一个参数的构造函数,可以隐式调用构造函数转换参数类型为类对象,在工程中需要避免隐式调用

类中定义类型转换函数可以完整类型之间的隐式转换,例如:operator int(){}

类型转换函数和转换构造函数两者可能相互冲突

子类对象调用父类构造函数隐式调用为无参构造函数,显示调用构造函数需要采用初始化列表

父子关系
父类对象可以被子类赋值;
父类对象可以被子类初始化;
父类指针可以指向子类;
父类引用可以被子类初始化;
父类指针或引用访问子类对象时,会完全退化为父类对象

函数重写必须多态实现,否则没有意义

多继承不利于大项目的开发

工程中实现多继承的方式为单继承加多接口的方式实现

子类调用父类的成员函数,且该父类成员函数调用带virtual关键字的成员函数,会产生怎么样的调用?

dynamic_cast与继承相关的类型转换关键字,要求相关类中必须有虚函数;
dynamic_cast用于有直接或间接继承关系的指针或引用之间;

函数模板可以由编译器自动推导,编译器对函数模板进行两次编译:1.对模板代码本身进行编译;2.对参数替换后的代码进行替换
编译器无法自动推导函数模板的返回值类型,可以从左到右部分指定类型参数
当函数模板遇到重载,编译器会优先考虑普通函数,后生成最优的函数类型
函数模板只有完全特化
函数模板使用数值类型作为模板参数,在具体调用时不能为变量,浮点数和对象

类模板需要显示指定调用
类模板有部分特化和完全特化

单例模式:
1.将构造函数的访问属性设置为private;
2.定义instance指针初始化为NULL
3.需要使用对象是,通过静态成员函数创建对象并使用instance标记

C语言处理异常的方式:setjmp和longjmp联合使用

变参函数调用对象时会造成程序的崩溃

构造函数抛出异常:
1.构造过程立即停止
2.当前对象无法生成
3.析构函数不会被调用
4.对象所占用的空间立即收回

析构函数异常将导致所使用的资源无法完全释放

构造函数和析构函数调用成员函数不会产生多态调用

只能在堆上生成对象:将析构函数设置为私有。
原因:C++是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。

只能在栈上生成对象:将new 和 delete 重载为私有。
原因:在堆上生成对象,使用new关键词操作,其过程分为两阶段:第一阶段,使用new在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象。将new操作设置为私有,那么第一阶段就无法完成,就不能够再堆上生成对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值