IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Effective C++ Item 04: 确定对象初始化 -> 正文阅读

[数据结构与算法]Effective C++ Item 04: 确定对象初始化

未初始化的对象

如果定义一个int型变量没有初始化,

int a;

在某些编译器上不会通过编译, 会有一个uninitialized local variable的编译错误。
如果在类中有一个未初始化的成员变量, 则成员变量的状态为未定义:

class Test
{
public:
	int a, b;
};

我们的处理办法是永远在使用对象之前将其初始化,对于内置类型,可以手动初始化:

int a = 0;

自定义类型的对象, 需要使用构造函数来进行初始化:

ABEntry::ABEntry(const std::string& name, const std::string& address,
                 const std::list<PhoneNumber>& phones)
{
	theName = name;
	theAddress = address;
	thePhones = phones;
	numTimesConsulted= 0;
}

上面的做法并不是最佳做法,因为成员变量实际并不是被初始化, 而是被赋值,最佳的方法是使用初始化成员列表(member initialization list)

ABEntry::ABEntry(const std::string& name, const std::string& address,
                 const std::list<PhoneNumber>& phones)
: theName(name)
, theAddress(address)
, thePhones(phones)
, numTimesConsulted(0)
{
}

第一种方法实际调用了一次默认构造函数, 并进行了赋值, 第二种直接调用了复制构造函数, 因此从效率上来讲, 第二种的效率较高。

在c++的初始化次序中, base class总是最先被初始化, derived class后被初始化,而class成员以其被声明的次序初始化,

不同编译单元内non-local static 对象的初始化

static 对象的寿命为从构造出来到程序结束为止, 非函数内生命的静态变量被称为non-local static 变量,程序结束时对象会被自动销毁, 析构函数在main()结束之后被调用,
编译单元是指产出单一目标文件的源码, 如果我们有两个源码文件,每一个都含有non-local static 变量,问题在于如果一个文件中的变量使用了另一个文件中的变量, 而用到对象时变量尚未初始化, 就会
产生问题,

class FileSystem
{
public:
	...
	std::size_t numDisks() const;
	...
};
extern FileSystem tfs;



class Directory
{
public:
	Directory(params);
	...
};

Directory::Directory(params)
{
	...
	std::size_t disks = tfs.numDisks();
	...
}

我们无法保证哪个变量会先被初始化,为了解决这个问题,我们可以使用设计模式中的singleton模式,

class FileSystem {...};
FileSystem& tfs()
{
	static FileSystem fs;
	return fs;
}

class Directory {...};
Directory::Directory(params)
{
	...
	std::size_t disks = tfs().numDisks();
	...
}

Directory& tempDir()
{
	static Directory td;
	return td;
}

这样就可以保证, 函数内的local static对象会在该函数被调用期间时被初始化。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:26:26  更:2021-09-26 10:28:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:36:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码