设为首页 加入收藏

TOP

C++你可能不知道地方(一)
2012-11-01 15:47:58 来源: 作者: 【 】 浏览:1798
Tags:可能 知道 地方

  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++(www.cppentry.com)规定,对象的成员变量初始化动作发生在进入构造函数本体之前。在构造函数内成员变量赋值都不是初始化,而是赋值。
  
  赋值时首先调用默认构造函数为m_sName,m_iAge,m_iHeight赋初始值,然后在立刻调用赋值操作符进行赋新值。
  
  成员初始列表是将各个成员变量实参都作为复制构造函数的实参。
  
  所以看出赋值相对于初始化,多了一步就是使用赋值操作符进行赋值。所以初始化的效率比赋值的效率高多了。但是对于内置类型,它们效率是一样的。
  
  二、空类
  
  想想你如果声明一个空类,C++(www.cppentry.com)编译器会对它做什么呢?编译器就会为它声明一个复制构造函数,赋值操作符和一个析构函数,以及默认构造函数。所有这些函数都是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 };
  
  原因是类成员函数或者友元函数尝试拷贝对象,编译器便会尝试生成一个复制构造函数与赋值操作符,并会调用基类的对应函数,但是会被拒绝,因为基类这些函数是private.
  
  3、++函数
  
  下面说说“*++”与“++*”中你不知道的事情,c++规定后缀形式自加函数有一个int类型参数,当函数被调用时,便其一传递一个0作为int参数的值传递给该函数,而前缀形式自己函数,类型参数没有要求,所以这样就能区分一个++函数是前缀形式与后缀形式了,具体代码如下:
  
  1 class UPInt{
  
  2 public
  
  3 UPInt& operator++( ) ; //++ 前缀
  
  4 const UPInt operator++( int ); //++后缀
  
  5 UPInt& operator --( ); // --前缀
  
  6 const UPInt operator --( int ) //--后缀
  
  7 UPInt& operator +=( int ); //
  
  8 …
  
  9 };
  
  10
  
  11 UPInt & UPInt::operator++( )
  
  12 {
  
  13 *this += 1;
  
  14 return *this;
  
  15 }
  
  16
  
  17 const UPInt UPInt :: operator++( int )
  
  18 {
  
  19 UPInt oldValue = *this;
  
  20 ++(*this);
  
  21 return oldValue;
  
  22 }

[1] [2] 下一页

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++异常之异常说明 下一篇C/C++学习指针一些事

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: