对Effective条款学习
12。尽量使用初始化而不要在构造函数里赋值
在构造一个类时,对数据成员进行赋值通常有两种方法实现,一种是使用成员初始化列表,一种是在构造函数体内赋值。当然,在很多情况下
选择类似的方法时,看重的不是他的效率问题,更多的是看他的设计需求上。
先来看这个类
template<class t>
class namedptr {
public:
namedptr(const string& initname, t *initptr);
...
private:
const string name;
t *ptr;
};
该类的意图很明显,使得名字和一个t类型的对象指针关联起来。那么在接口上,首先避免类一些不必要的拷贝,防止传入的名字被修改(这更
多是为了语意),因此加上了const和引用;接着在数据成员name上我也不希望别的方法能修改上,加上const修饰。好了现在先扯上语法了,
加了const的数据成员就不得不用初始化了。那么看看const string name有什么功能了,在对接口的的规范化(防止修改,防止拷贝的耗费)
和const关键字,这样就生成了一个其名字成员在类外可以被修改而在内部只是只读对象
事情到这里好象就结束了,不是的,还有一些东西可以学习
大家是否想过如果有多个的数据成员下:
class manydatambrs {
public:
// 缺省构造函数
manydatambrs();
// 拷贝构造函数
manydatambrs(const manydatambrs& x);
private:
int a, b, c, d, e, f, g, h;
double i, j, k, l, m;
};
假如想把所有的int初始化为1而所有的double初始化为0,那么用成员初始化列表就要这样写:因为对于固定数据类型来说,初始和赋值不会有
什么效率上的偏差
manydatambrs::manydatambrs()
: a(1), b(1), c(1), d(1), e(1), f(1), g(1), h(1), i(0),
j(0), k(0), l(0), m(0)
{ ... }
manydatambrs::manydatambrs(const manydatambrs& x)
: a(1), b(1), c(1), d(1), e(1), f(1), g(1), h(1), i(0),
j(0), k(0), l(0), m(0)
{ ... }
这很容易出错,而且不易维护我们这样
void manydatambrs::init()
{
a = b = c = d = e = f = g = h = 1;
i = j = k = l = m = 0;
}
manydatambrs::manydatambrs()
{
init();
...
}
manydatambrs::manydatambrs(const manydatambrs& x)
{
init();
...
}
好了总结下
1 效率上的问题,
2 语意上的问题导致加了限定符不得不使用
分享到:
相关推荐
条款12: 尽量使用初始化而不要在构造函数里赋值 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同 条款14: 确定基类有虚析构函数 条款15: 让operator=返回*this的引用 条款16: 在operator=中对所有...
因此,推荐使用成员初始化器而非赋值语句,这一做法可以显著简化构造函数的编写,同时确保成员变量在构造过程中得到正确且一致的初始化。 成员初始化器是在变量声明的时候就对成员变量进行初始化的语法结构。这不仅...
本笔记总结了Effective C++的第1到第11条款,涵盖了C++语言的多个方面,包括构造函数、拷贝构造函数、拷贝赋值函数、const关键字、enum、inline函数、定义域、static变量、初始化、编译器生成的函数、拷贝控制、多态...
**条款12:尽量使用初始化而不要在构造函数里赋值** - **目的**: 减少错误和提升效率。 - **解释**: 初始化列表是一种更高效、更安全的方法来设置成员变量的初始值。使用初始化列表而不是在构造函数体中赋值可以...
- 确保对象在使用前被初始化,特别是对于非内置类型,应在构造函数中初始化所有成员。 - 对于多个构造函数和多个成员,可以将共同的初始化逻辑放到私有辅助函数中。 7. **static对象的初始化**: - 可以使用函数...
- 在C++中,对象必须在使用前被正确初始化。 - 对于内置类型的对象,应手动初始化;对于类类型的对象,应依赖构造函数。 - 使用成员初始化列表来初始化类的成员变量,效率更高。 6. 条款5:了解C++默默编写并...
C++中构造函数和析构函数的使用至关重要,它们分别负责对象的初始化和清理工作。在设计类的时候,应当考虑到构造函数的异常安全性和析构函数的“非虚拟性”。避免在构造函数中调用虚函数,因为对象在构造期间的动态...
条款6讲解了如何通过私有化或删除特定的函数(如拷贝构造函数和赋值运算符)来禁用这些操作。 7. 条款7:为多态基类声明virtual析构函数 当使用基类指针删除派生类对象时,如果基类的析构函数没有被声明为virtual,...
4. **确定对象使用前已先被初始化**:确保对象在使用前已被正确初始化,可以预防许多运行时错误。C++标准库中的`std::pair`和`std::tuple`等类型提供了默认初始化。 5. **了解C++默默编译并调用哪些函数**:C++会...