2023.10.16
今天开始看Effective C++和侯捷的面向对象高级编程
主要是Effective C++的第一章内容
Copy构造函数和copy assignment操作符
class Student
{
public:
int t;
Student();
Student(const Student &o);
Student &operator=(const Student &a);
};
Student a; // 1
Student s(a); // 2
Student b; // 3
b = a; // 4
Student c = a; // 5
1使用default构造函数,2使用copy构造函数,4使用的是copy assignment操作符,而5使用的是copy构造函数。只要有新对象被定义,一定使用了构造函数
C++的几个层次
Object-oriented面向对象
Template泛型编程
STL库
取代#define
Class专属常量的声明式和定义式
一般情况下,class的专属常量只需要声明式,就像:
static const int Num = 5;
只要不取地址是不需要定义式的。
如果需要写定义式,应该写成
const int ClassName::Num;
因为在声明时已经复制,因此定义时不需要赋值。如果某些旧式编译器不支持在声明式赋初值,就在定义式中赋初值。在此时如果在类中需要定义一个数组的成员数量为该常量时,常量没有被赋值,可以使用the-enum-hack,即使用一个枚举类型的数值权当常量int使用。
对于单纯常量,最好以 const 对象或 enum 替换#define
宏函数
对于形似函数的宏 ,最好改用 inline 函数替换 #define
Const
如果关键字 const 出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。
迭代器中的const
迭代器可看作指针(或智能指针),为迭代器声明const是将指针视为常量,如果要把迭代器所指之物不可改动,需要使用const_iterator。
physical constness和logical constness
physical constness是指成员函数不更改对象的任意成员变量时使用const,但是会出现以下“反常识”情况:某个成员函数更改了指针的所指值,只有指针隶属于对象。
logical constness 是指在逻辑上(?)不更改
上图中就是logical constness ,但是无法通过编译器,需要引入关键字mutable
当 const 和 non-const 成员函数有着实质等价的实现时,令 non-const 版本调用 const 版本可避免代码重复。