[编程语言][C++]类成员变量初始化之坑-创新互联

类成员变量初始化之坑
  • 问题描述
  • 总结

创新互联公司服务项目包括临朐网站建设、临朐网站制作、临朐网页制作以及临朐网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,临朐网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到临朐省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!问题描述

按照经验,设计一个类时需要对成员变量进行初始化。C++提供了两种初始化成员变量的途径,让程序员有了一些的选择空间。同时,这也给程序员留下了坑。

初始化类成员变量的途径:

  1. 在定义成员变量时初始化
  2. 在初始化成员列表中初始化

据此,设计以下代码:

#includeusing namespace std::literals;

std::string generate_name_1()
{std::cout<< "Calling generate_name_1() ..."<< std::endl;

	return "Alex"s;
}

std::string generate_name_2()
{std::cout<< "Calling generate_name_2() ..."<< std::endl;

	return "Brant"s;
}

std::string generate_name_3()
{std::cout<< "Calling generate_name_3() ..."<< std::endl;

	return "Chris"s;
}

class person_1
{public:
	person_1() = default;

	std::string name() const {return m_name; }

private:
	std::string m_name{generate_name_1() };
};

class person_2
{public:
	person_2() :m_name{generate_name_2() } {}

	std::string name() const {return m_name; }

private:
	std::string m_name;
};

class person_3
{public:
	person_3() :m_name{generate_name_2() } {}

	std::string name() const {return m_name; }

private:
	std::string m_name{generate_name_1() };
};

class person_4
{public:
	person_4() :m_name{generate_name_2() }
	{m_name = generate_name_3();
	}

	std::string name() const {return m_name; }

private:
	std::string m_name{generate_name_1() };
};

int main()
{std::cout<< "===== class person_1 ====="<< std::endl;
	person_1 person1;
	std::cout<< person1.name()<< std::endl;
	std::cout<< std::endl;

	std::cout<< "===== class person_2 ====="<< std::endl;
	person_2 person2;
	std::cout<< person2.name()<< std::endl;
	std::cout<< std::endl;

	std::cout<< "===== class person_3 ====="<< std::endl;
	person_3 person3;
	std::cout<< person3.name()<< std::endl;
	std::cout<< std::endl;

	std::cout<< "===== class person_4 ====="<< std::endl;
	person_4 person4;
	std::cout<< person4.name()<< std::endl;
	std::cout<< std::endl;

	return EXIT_SUCCESS;
}

上述代码的运行结果如下:

===== class person_1 =====
Calling generate_name_1() ...
Alex

===== class person_2 =====
Calling generate_name_2() ...
Brant

===== class person_3 =====
Calling generate_name_2() ...
Brant

===== class person_4 =====
Calling generate_name_2() ...
Calling generate_name_3() ...
Chris

我们看到:

  1. 如果定义成员变量时初始化,则使用此处的初始化值
  2. 如果在初始化成员列表中初始化,则使用此处的初始化值
  3. 如果定义成员变量时初始化,并且同时在初始化成员列表中初始化,则定义成员变量时的初始化被忽略
  4. 如果在构造函数的函数体内给成员变量赋值,则该已被初始化的成员变量的值在此处被赋值。

总的来说就是:赋值会覆盖初始化值,初始化成员列表中的初始化会覆盖定义成员变量时的初始化。

总结
  1. 最好对所有的类成员变量进行初始化,以防止其值处于不确定的状态。
  2. 基础且通用的初始化值应该在定义类成员变量时进行初始化,而较为特殊的初始化值应该在构造函数的初始化成员列表中进行初始化。
  3. 最好不要在构造函数中,试图通过赋值的方式对成员变量进行初始化。因为这样会多出赋值的过程,降低程序的性能。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:[编程语言][C++]类成员变量初始化之坑-创新互联
标题URL:http://pwwzsj.com/article/ceehep.html