关闭

C语言你可能不知道一些地方

发表于:2012-11-08 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  C++中编译器替我们完成了许多事情,我们可能不知道,但也可能习以为常。下面详细介绍

  一、初始化与初始赋值

  首先说说类的初始化与初始赋值之前的区别,这也许里面可能有我们不知道的事情。

  其实类初始化与初始赋值还是有区别的。

1 class People{
2 public:
3 People(std::string name,int age,int height);
4 private:
5 std::string m_sName;
6 int m_iAge;
7 int m_iHeight;
8 }
9 //赋值
10 People::People(std::string name,int age,int height)
11 {
12 m_sName=name;
13 m_iAge=age;
14 m_iHeight=height;
15 }
16 //初始化列表
17 People::People(std::string name,int age,int height)
18 :m_sName(name),m_iAge(age),m_iHeight(height)
19 {}

  C++规定,对象的成员变量初始化动作发生在进入构造函数本体之前。在构造函数内成员变量赋值都不是初始化,而是赋值。

  赋值时首先调用默认构造函数为m_sName,m_iAge,m_iHeight赋初始值,然后在立刻调用赋值操作符进行赋新值。

  成员初始列表是将各个成员变量实参都作为复制构造函数的实参。

  所以看出赋值相对于初始化,多了一步就是使用赋值操作符进行赋值。所以初始化的效率比赋值的效率高多了。但是对于内置类型,它们效率是一样的。

  二、空类

  想想你如果声明一个空类,C++编译器会对它做什么呢?编译器就会为它声明一个复制构造函数,赋值操作符和一个析构函数,以及默认构造函数。所有这些函数都是public而且inline函数。

  编译器写的赋值构造函数和赋值操作符,只是单纯地将来源对象的每个non-static变量拷贝到目标对象,具体是进行位拷贝。

  如果声明了一个构造函数,编译器是不会创建默认构造函数。

  如果不希望类支持拷贝构造函数与赋值操作符怎么办?不声明?按照上面说明编译器会自动帮你生成。那么可以将它们声明为private,这样阻止编译器自动生成拷贝构造函数(public)。private成功阻止他人使用,但是这并不安全。因为类成员函数以及友元函数还是可以调用private的拷贝构造函数和赋值操作符。

  如果只在private下声明拷贝函数和赋值操作符,在有人通过类成员函数去以及member函数去调用它,会获得一个连接错误。那么这里能不能将错误在编译的时候体现出来呢?这里只用将拷贝函数声明为private,并且不在自身,就可以办到了。显然继承一个拷贝函数和赋值操作符为private的基类就办到了,基类如下:

1 class NonCopyable{
2 protected:
3 NonCopyable (){}
4 ~ NonCopyable (){}
5 private:
6 NonCopyable (const NonCopyable &);
7 NonCopyable & operater=(const NonCopyable &);
8 };

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号