标签:指针类型 合成 tor 生成 拷贝构造 tco out stp 自动
本文主要是《C++ Primer Ed5》第13章内容,希望能够对C++的拷贝控制了解的更为深入一些。
C++中的拷贝控制操作主要涉及的几个拷贝控制函数为:
=
定义变量时operator=
std::is_trivial<T>::value
查看,见代码中的TestPOD
,这部分暂不深入=delete
将函数定义为删除的,这样用户便不可再调用之=delete
必须出现在函数第一次声明时,而=default
则不是
TestDefaultAndDelete
delete
#include <iostream>
#define PRINT_INFO(str) std::cout << str << std::endl;
#define PRINT_MEM_INFO(str, x) std::cout << str << x << std::endl;
class FDatas {
public:
FDatas(const std::string& str, int n) : id_(str), value_(n) {
PRINT_MEM_INFO("default copy, id_ = ", this->id_);
}
FDatas(const FDatas& fd) {
this->id_ = fd.id_;
this->value_ = fd.value_;
PRINT_MEM_INFO("this is copy constructor. id_ = ", this->id_);
}
// 重载运算符,必须定义为成员函数,这样运算符左侧的则能绑定到隐式的this参数中
FDatas& operator=(const FDatas& fd) {
this->id_ = fd.id_;
this->value_ = fd.value_;
PRINT_MEM_INFO("this is copy operator, id_ = ", fd.id_);
return *this;
}
~FDatas() { PRINT_INFO("this is deconstructor"); }
public:
void Print() { PRINT_MEM_INFO("Print id_ = ", this->id_); }
private:
std::string id_;
int value_;
};
// gcc会做优化,返回临时对象时,不会构造临时对象了,加上-fno-elide-constructors才会
FDatas CopyData(FDatas fd) {
PRINT_INFO("test CopyData");
// 拷贝构造
FDatas tmp_fd = fd;
return tmp_fd;
}
void TestCopyConstructor() {
FDatas fd("abc", 13); // 直接初始化
FDatas fd1 = fd; // 拷贝初始化
FDatas fd1_1(fd); // 直接初始化
PRINT_INFO("test copy data");
// fd1拷贝给形参,调用拷贝构造函数
FDatas fd2 = CopyData(fd1);
FDatas fd3("ff", 12);
fd3 = fd2; // 拷贝赋值运算符
PRINT_INFO("sdf");
fd3.~FDatas(); // 即便显示调用了析构函数,最后还是会调用一次析构,因为这时候对象还是在内存中
fd3.Print();
PRINT_INFO("sdf111");
}
// POD
class A {};
class A1 {
A1(const A& a) {}
};
class B {
~B();
};
// 用std::is_trivial<T>::value判断是否为平凡类型
void TestPOD() {
PRINT_MEM_INFO("is_trival FDatas: ", std::is_trivial<FDatas>::value);
PRINT_MEM_INFO("is_trival A: ", std::is_trivial<A>::value); // 1
PRINT_MEM_INFO("is_trival A1: ", std::is_trivial<A1>::value); // 0, 有不平凡的构造函数
PRINT_MEM_INFO("is_trival B: ", std::is_trivial<B>::value); // 0, 有不平凡的析构函数
}
class FDataNew {
public:
FDataNew() = default;
FDataNew(const FDataNew& fdn) = default;
FDataNew& operator=(const FDataNew& fdn);
~FDataNew() = default;
};
FDataNew& FDataNew::operator=(const FDataNew& fdn) = default;
struct FD {
FD() = default;
~FD() = delete;
};
void TestDefaultAndDelete() {
FDataNew fdn;
FDataNew fdn1(fdn);
FD* fd = new FD(); // Ok
// delete fd; // error, 析构函数被delete了
}
int main(int argc, char* argv[]) {
TestCopyConstructor();
TestPOD();
TestDefaultAndDelete();
return 0;
}
标签:指针类型 合成 tor 生成 拷贝构造 tco out stp 自动
原文地址:https://www.cnblogs.com/xiangs/p/12774360.html