C++的类默认有哪些成员?

来源:互联网 发布:12309网络举报平台 编辑:程序博客网 时间:2024/05/01 05:50
 

我们可以思考一下,当我们定义一个形式上空的类,C++为这个类提供了哪些默认功能?是否可以说齐全呢?

有些看起来理所当然的东西,也是需要默认实现的。

看简单代码

view sourceprint?
01#include <iostream>
02  
03class TTestClass{};
04  
05int main(int argc,char**argv)
06{
07    TTestClass tc;
08    TTestClass *p = &tc;
09    tc = *p;
10    deletep;
11}
  1. view sourceprint?
    1TTestClass tc; 说明C++提供了默认的拷贝构造函数。
  2. view sourceprint?
    1TTestClass *p = &tc; 表明C++为类实现了取得地址运算符。
  3. view sourceprint?
    1tc = *p; 代表C++ 实现了赋值操作符号
  4. view sourceprint?
    1delete p; 代表实现了析构函数。
view sourceprint?
1因此可以总结一下,C++ class的默认接口大致为
view sourceprint?
01<DIV class=cnblogs_Highlighter><PREclass=brush:cpp>classTObject{ 
02public:
03    TObject();
04    ~TObject();
05    TObject(constTObject &src);
06    TObject &operator=(constTObject &src);
07    TObject *operator&(constTObject &src);
08};
09</PRE>
10</DIV>

另外注意语句

view sourceprint?
1TTestClass tc = xxx;

仅仅调用了拷贝构造函数。区分"="是赋值还是copy constructor的关键就是要看"="左边的对象已经构造了没有

  • 如果已经构造了,就是进行赋值操作
  • 如果还没有构造,就是进行copy构造函数

下面的代码证明了上述观点

 

代码
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include <iostream>class TestClass{private:    int data;public:    TestClass(): data(-1){        std::cout<<"Default Constructor"<<std::endl;    }    TestClass(const TestClass &src){        std::cout<<"Copy Constructor"<<std::endl;            }    ~TestClass(){        std::cout<<"Default Destructor"<<std::endl;                }         TestClass& operator=(const TestClass &src){        std::cout<<"Asign Value Operator"<<std::endl;        memcpy(this, &src, sizeof(src));        return *this;    }    void setData(int data){        this->data = data;    }    int getData(){        return data;    }};    int main(){    TestClass tc; //默认构造     tc.setData(0);    TestClass tc1 = tc; //拷贝构造     TestClass tc2(tc); //拷贝构造     TestClass tc3;// 默认构造     tc3 = tc; // 赋值操作     std::cout<<tc.getData()<<" "<<tc1.getData()<<" "<<tc2.getData()<<" "<<tc3.getData()<<std::endl;    return 0;} 运行结果为Default ConstructorCopy ConstructorCopy ConstructorDefault ConstructorAsign Value Operator0 4247360 -1859193535 0Default DestructorDefault DestructorDefault DestructorDefault Destructor

请按任意键继续. . .

注意 中间两个的结果数值诡异的原因是我们写的拷贝构造函数没有真的copy,应该向赋值操作那样memcpy一下

最后对象销毁,执行了三次析构函数

原创粉丝点击