c++ primer class部分小结
前言:(今日终于肝完c++ oo部分)
oo目的是为了方便代码抽象、重构、封装的一种编程范式,大部分大型程序的重要实现方式. 本文简单总结,关注oo中的几个初级细节
this指针
对象的一种默认隐式成员,是指向类类型变量(对象)非常量的const指针(很绕…)
使用方法举例:
//显式地访问成员变量
//通过this访问
std::string isbn() const{
return this->bookNo;
}
需要清楚的是this指针是默认隐式的存在,在对象内访问的成员过程中已经加上了this->。
使用上的几个注意点:
1、当在定义一个返回this对象的函数时,要对this解除引用
2、因为不能将一个this绑定到一个常量对象上(编译器不一定负责检查,是ud行为),所以此时需要把this申明为指向const类型的const指针。而c++中const 成员函数帮我们把this隐式定义为顶层和底层的const的。 即总结为->因为常量对象、常量对象的引用和指针都只能调用const成员函数
const 成员函数
对于变量是const类型,使用时必须将其声明为const函数(否则this不可用)
对于构造带有const成员变量的构造函数
使用一个非常量版本的参数
构造函数问题
合成的默认构造函数
1、对于没有申明构造函数的类。使用默认构造函数进行构造,由编译器生成
2、对于申明了带有默认参数的构造函数不需要单独定义默认构造函数外,其他定义了构造函数的行为都需要重新定义默认构造函数。c++11可使用形式为Sales_data=default()
3、对于构造函数的匹配问题,不涉及到类型转换时,从实际参数个数->候选匹配->最佳匹配.如果最佳匹配存在多个则编译器报错。其中对应类型的参数列表匹配优胜于类型转化的参数匹配。
警告!:如果类中存在非build-in类型(没有默认的初始化行为的类型),则使用默认构造函数是ud行为。这种情况请使用合成的构造函数/构造函数,而不是合成的默认构造函数
隐式的类类型转换
隐式的类类型转化只允许一次!!!!
例如
//item.combine(Sales_data &rhs)
//其中rhs成员有string 成员
item.combine("123456");//不合法 两次转化 const char*->string->Sales_data
item.combine(Sales_data("123456"));//合法 一次转化
explicit能够抑制隐式的类型转换
如果出现编译器报错
因此explicit构造函数
只接受显式的构造函数
友元
友元的使用过程
假如:A类的友元x 需要使用到 B类的成员对象t
- 定义A类->申明函数x(注意这里不能定义!!)
- 声明B类->定义B类,定义A的x是B的友元
- 定义A的x
注意:友元函数在使用之前必需要经过申明(在main作用域中)
友元的注意事项:
- 友元关系不传递
- 函数重载不传递友元性质
- 作用域是其"朋友",但是使用之前需要在当前作用域申明.
类的静态变量
必须在类外部初始化类的静态成员!
方法:
//类如 只能在外部初始化 并且初始化过程中可以使用类的所有成员
double Account::interestRate=initRate();
类的静态成员独立与对象,作用域是全局
因为独立,可以使用静态成员作为默认实参初始化类内成员
注意对于类的静态成员:最好把静态成员的定义和其他非in-line函数的定义放在同一个文件中
类的初始化
对于类的初始化过程,如果成员是const类型的,则无法使用赋值初始化
对于c++来说赋值和初始化是截然不同的(大部分效果相同)的操作
对于成员是const的可以使用 初始值列表方法
//其中i ci是const*的
//可行
constRef::ConstRef(int li):i(li),ci(li),ri(i){}
//不可行
constRef::constRef(int li)
{
i=li;
ci=li;//不可行 不可以用const(*)指向非const变量
ri=i;//不可行
}
委托构造函数
具有传递性
成员函数的返回值
对于成员函数来说如果是build-in类型可以直接返回
如果是类的重定义类型则需要返回 class::typeinClass class::func() 的形式
其他
- 类内部定义的函数是默认in-line的
- 待补充
后言:完成了类的细节触探,了解了c++内存池管理后再补上析构函数以及设计模式注意方法部分.