【学习笔记】Effective C++

【Effective C++】学习笔记

条款01、视C++为一个语言联邦

条款02、尽量以const、enum、inline替换#define
#define是使用预处理器进行处理,无法被编译器知道,因此在发生错误时无法进行追溯。

条款03、尽可能使用const
const修饰指针,指针本身不能改变:char* const p
const修饰内容,指针所指物不能改变(明确来讲应该是不能通过指针来改变所指物的值):const char* p=char const *p
简单总结:const放在星号之前表示修饰内容,const放在星号之后表示修饰指针。
const的使用,
const修饰迭代器
1、因为迭代器的功能和指针类似,所以const修饰迭代器就和修饰指针有同样的功能,即该迭代器不能指向其他的内容:
const std::vector::iterator iter=vec.begin();
++iter 该指令是错误的,因为该迭代器不能指向别的内容(失去了迭代器的原有功效,所以很少用)
2、若希望所指代的内容不能被改变,则需要使用const_iterator:
std::vector::const_iterator cIter=vec.begin();
*cIter=10 该指令是错误的,因为不能改变所指向的内容
const修饰函数,函数返回值、各参数和函数自身(类的成员函数)
1、函数的返回值:
若函数返回的是一个具体的值,对其进行const修饰没有任何意义,因为返回的值都是进行复制进行赋值的;
或者可以配合值的引用一起使用&,代表返回的是值的引用。

const A &GetA(void)

如果返回的是一个指针,则有一定的意义,该返回值只能被赋给加const修饰的同类型指针。例如函数:

const char * GetString(void);

如下语句将出现编译错误:

char *str = GetString();

正确的用法是

const char  *str =GetString();

2、函数的参数:
函数输入参数的修饰,与值的修饰和指针的修饰是一样的道理。常与函数的引用传递&一起使用,如:

void Func(const int &x)

3、类的成员函数:

int get() const{ ... }

代表该函数不能修改对象的数据成员而且不能调用非const函数。任何不会修改数据的成员函数都应该使用const进行修饰。
const修饰this是本质,至于说“表示该成员函数不会修改类的数据。否则会编译报错”之类的说法只是一个现象,根源就是因为this是const类型的
但是有一种例外的情况就是const成员函数可以改变成员变量,即使用mutable进行修饰,例变量year:
mutable int year;
则year变量在const函数里面可以被改变。

总结
1、const一般和值的引用&一起进行使用,目的是提高程序的效率的同时又不改变值;
2、const修饰成员函数的主要作用是避免成员函数改变成员变量的值,其根源是修饰*this为const。再者,const对象只能调用const成员函数;
3、相对应的知识还有const_cast、static_cast等强制类型的转换。

条款04、确定对象被使用前已经被初始化
初始化是一个比较复杂的问题,需要后面的知识作为背书。
初始化的问题,一般是落在构造函数身上。
1、构造函数总是使用成员初值列对成员进行初始化;
2、如果成员变量是const或reference,他们就一定需要初值,不能被赋值;

条款05、了解C++默认编写并调用了哪些函数
1、C++类中会默认生成默认构造函数、copy构造函数、copy assignment操作符、析构函数。

条款06、若不想使用编译器自动生成的函数,就该明确拒绝

条款07、
条款08、
条款09、
条款10、
条款11、
条款12、
条款13、
条款14、
条款15、
条款16、
条款17、
条款18、
条款19、
条款20、

发布了15 篇原创文章 · 获赞 4 · 访问量 851

猜你喜欢

转载自blog.csdn.net/weixin_43319685/article/details/104098416