文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C++的类默认有哪些成员?

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

时间:2010-12-18  来源:霞光照耀

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

看简单代码

#include <iostream>

class TTestClass{};

int main(int argc, char **argv)
{
        TTestClass tc;
        TTestClass *p = &tc;
        tc = *p;
        delete p;
}
  1. TTestClass tc; 说明C++提供了默认的拷贝构造函数。
  2. TTestClass *p = &tc; 表明C++为类实现了取得地址运算符。
  3. tc = *p; 代表C++ 实现了赋值操作符号
  4. delete p; 代表实现了析构函数。
因此可以总结一下,C++ class 的默认接口大致为
class TObject{ 
public:
        TObject();
        ~TObject();
        TObject(const TObject &src);
        TObject &operator=(const TObject &src);
        TObject *operator&(const TObject &src);
};

另外注意语句

TTestClass tc = xxx;

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

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

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

 

代码
#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 Constructor
Copy Constructor
Copy Constructor
Default Constructor
Asign Value Operator
0 4247360 -1859193535 0
Default Destructor
Default Destructor
Default Destructor
Default Destructor
请按任意键继续. . .

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

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

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载