Effective c++
文章平均质量分 69
高二的笔记
这个人很懒,什么都没有写。
展开
-
条款4:确定对象被使用前已先被初始化
确定对象被使用前已先被初始化,言简意赅。 因为如果直接使用未初始化的对象,初值未定,行为是不明确的,可能会让程序终止运行,或者发生不可预测的行为等。在c++中,可以通过该类的构造函数初始化该类所包含的所有成员变量。引用书中的说法:“确保每一个构造函数都将对象的每一个成员初始化” 需要注意的是在使用构造函数初始化对象时应当使用构造函数的初始化列表初始化成员,而不是赋值运算,比如: class MyType { public: MyType() { cout << "defa原创 2022-03-05 11:01:43 · 458 阅读 · 0 评论 -
条款18:让接口容易被正确使用,不易被误用
程序设计中经常遇到的便是如何设计接口,让用户能够直观的、快速的了解并上手使用接口。让接口容易被正确使用,不易被误用便是本条款所强调的。 理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不应该通过编译;如果代码通过了编译,他的作为就该是客户所想要的。 比如这样一个表示时间的类: class Date { public: Date(int month, int day, int year); }; 如果我们不对接口做一些“强制性“的约束,该接口就可能被误用: Date date(原创 2022-02-25 21:43:49 · 120 阅读 · 0 评论 -
条款3 尽可能使用const
尽可能使用const原创 2022-01-15 17:18:47 · 334 阅读 · 0 评论 -
条款23和条款24
条款23:宁以non-member、non-friend替换member函数 为什么要用非成员函数、非友元函数替换成员函数呢?其实这是为了保证数据的封装性。而数据的封装性强弱是怎么体现的呢?一种粗糙的量测,我们认为越多的函数能访问它,数据的封装性就越低,因为如果数据发生改变,因它的改变牵扯到需要改变的太多,所以它的封装性较差。 而非成员函数、非友元函数较成员函数而言,不能访问private中的数据,自然封装性就更好一些。 需要注意的是,只因在意封装性而让函数“成为class的non-member”,并不意味原创 2022-01-04 23:52:01 · 316 阅读 · 0 评论 -
条款20和条款21
条款20:宁以pass-by-reference-to-const替换pass-by-value原创 2021-12-07 22:31:10 · 612 阅读 · 0 评论 -
条款9和条款22
条款8:别让异常逃离析构函数 换句话说“如果析构函数需要执行某个可能抛出异常的操作,则该操作应该被放置在一个try语句块当中,并且在析构函数内部得到处理”。这句话来自c++ primer 685页。换句话说是不是感觉很明了。 来看一个例子: int zero = 0; class Widget { public: Widget() { cout << "default constructor" << endl; } ~Widget() { try { cout原创 2021-11-20 20:59:20 · 249 阅读 · 0 评论 -
条款5和条款16
条款5:了解c++默默编写并调用哪些函数 当我们写一个空类时,编译器会自动帮我们生成默认构造函数、析构函数、拷贝构造、以及赋值运算符。 因此对于这个类: class Demo {}; 编译器会生成: class Demo { public: Demo() {...} Demo(const Demo& demo) {...} ~Demo() {...} Demo& operator=(const Demo& demo) {...} }; 知识点:空类的大小为什么为1?原创 2021-11-13 11:44:43 · 640 阅读 · 0 评论 -
条款6和条款7
条款6:若不想使用编译器自动生成的函数,就该明确拒绝 在c++11中新增了一个语法= default = delete 来看一个例子: class Base { public: Base() = default; //使用默认的构造函数 Base(const Base &) = delete; //阻止拷贝 Base &operator=(const Base &) = delete;//阻止赋值 ~Base() = default; //使用默认的析构函数 };原创 2021-11-05 20:40:40 · 433 阅读 · 0 评论 -
条款10和条款13
条款10:令operator= 返回一个reference to *this 首先来看一个例子: class A { public: A() { cout << "defalut constructor" << endl; } ~A() { cout << "destructor" << endl; } void operator=(const A &a); int number; }; void A::operator=(con原创 2021-10-29 23:49:36 · 128 阅读 · 0 评论