条款04 确定对象被使用前已先被初始化

一、概述

手工初始化内置类型对象

构造函数的成员初始化列表

static对象的初始化:包括non-local static和local static

二、细节

1. 你的构造函数使用了成员初始值列表了咩

不使用初始值列表:

class A {
public:
	A(const string &s, int i)
	{
		//下面都是赋值,而非初始化
		s = name;
		score = i;
	}
private:
	string name;
	int score;
};

使用初始值列表:

class A {
public:
	A(const string &s, int i) :name(s), score(i)	{}
private:
	string name;
	int score;
};

C++规定,对象的成员变量的初始化动作发生在进入构造函数体之前,即上面那个版本的各成员会先被默认初始化,然后才进入函数体执行赋值操作。

补充:如果成员变量是const或references,那它们一定要初始化,而不能赋值!

2. 不同文件里的non-local static对象的初始化顺序是未定义的

我们可以将每个non-local static对象用一个返回其引用的函数封装起来,这样它就像local static对象了,至少函数被调用时它会被初始化。

时间: 2024-10-12 19:39:20

条款04 确定对象被使用前已先被初始化的相关文章

[effictive c++] 条款04 确定对象被使用前已被初始化

成员初始化 在c和c++ 中,使用为初始化的类型常常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个很好的习惯. 永远在使用之前对对象进行初始化.对于无任何成员的内置类型,你必须手工完成初始化操作.因为c++不保证初始化他们. 内置类型意外的其他东西,初始化责任落在构造函数身上.但要注意区分构造函数中的变量是赋值还是初始化.举个例子 class PhoneNumber{...}; class ABEntry{ public: ABEntry(

Effective C++ 条款四 确定对象被使用前已被初始化

1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      const int * p = &x; 3.不要混淆赋值与初始化的区别.一般初始化在定义的时候一起进行.而赋值是在定义之后的动作.      比如说在某一个类中的构造函数中,函数的行为都是赋值操作,而非初始化操作.      一般来说,对象的成员变量的初始化动作发生在进入构造函数本体之前.所以,我们一

Effective C++ 之 Item 4:确定对象被使用前已先被初始化

Effective C++ Effective C++ Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure that objects are initial

Effective C++ Item 4 确定对象被使用前已先被初始化

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验1:为内置对象进行手工初始化,因为C++不保证初始化它们 示例: int x = 0;//对int进行手工初始化 const char *text = "A C-style string"; //对指针进行手工初始化 double d; std::cin >> d;//以读取input stream的方式完成初始化 经验2:构造函数最好使用成员初值列 (membe

Effective C++ 条款4 确定对象被使用前已被初始化

1. 对于内置类型,如果变量在全局作用域内定义,默认初始化为0,如果变量在局部作用域内定义,默认不进行初始化; 对于类类型,默认调用默认构造函数进行初始化,如果没有默认构造函数,则必须显式初始化. 2. 构造函数对成员进行初始化的动作发生在初始化列表中而不是函数体内,在函数体内进行的"初始化"实际上是赋值,对于类类型,降低了程序效率,对于内置类型在初始化列表还是在函数体内初始化对于效率没有影响,但在某些特殊情况(例如const变量和引用)必须在初始化列表进行初始化. 3. 类类型的构造

条款4:确定对象被使用前已被初始化

一. 永远在使用对象之前将它初始化 1.对于内置类型,手动完成初始化. 例如:int =0; 2.除了内置类型之外的类型,由构造函数进行初始化:确保每个构造函数都将对象的每一个成员进行了初始化. 二. 特别区分"赋值"和"初始化" 例如:有一个类:A中有一个成员变量string  name; 有一个构造函数:A(const string &n){name=n;}//这是赋值操作而非初始化,这里调用了默认构造函数和赋值运算符 A(const string &a

Effective C++学习笔记 条款04:确定对象被使用前已先被初始化

一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. 1 class A 2 { 3 public: 4 A(const string &str) 5 { 6 m_str = str; //m_str 的初始化是在进入构造函数中用户自定义编写代码前完成的,所以这里的m_str = str,执行的不是初始化,而是赋值 7 } 8 private: 9 string m_str;

条款04:确定对象被使用前已先被初始化

01.为内置类型对象进行手工初始化,因为C++不保证初始化他们. 02.构造函数最好使用成员初始化列表,不要在构造函数本体进行赋值操作.成员变量都是在进入构造函数本体之前初始化的,在本体中进行的只是赋值操作.还有成员初始化列表的初始化顺序和他们在类中声明的顺序一致.const和引用变量必须使用成员初始化列表,引用必须要显式初始化. 03.为免除跨编译单元的初始化次序问题,用local static对象替换nonlocal static对象.

条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)

其实 无论学何种语言 ,还是觉得要养成先声明后使用,先初始化再使用. 1.永远在使用对象之前先将其初始化. 内置类型: 必须手工完成. 内置类型以外的:使用构造函数完成.确保每一个构造函数都将对象的一个成员初始化. shit!!读到这,以前一直以为有些概念独自觉悟到的,大牛们也有这样的想法!!!! 2.区分开assignment & initialization(这个需要再看看,似乎以前的认知是错误的!!!!) initializatin:在default构造函数时才是对非内置类型做初始化. a