拷贝(构造)函数
类含有6个默认成员函数,如果用户不自己定义,则编译器将会为用户实现:
- 初始化和清理
- 构造函数:完成初始化工作
- 析构函数:完成清理工作
- 拷贝和复制
- 拷贝构造函数:使用同类对象初始化
如果用户不实现拷贝函数的话,编译器会自动生成一个只有浅拷贝功能的拷贝函数,对于内建类型(int,float等)不会产生危害,但对于指针以及非内建类型,有可能引起错误
引入:为了可以用=来赋值类
接口:<class_name>(const <class_name>& <instance_name>)
实现:没有重载,可以使用初始化列表来初始化
引出深拷贝和浅拷贝 - 运算符重载函数:实现运算符重载
接口:operator p (argument-list) //p为运算符
- 拷贝构造函数:使用同类对象初始化
- 取地址重载
就是获取类的地址,一般来说使用默认函数即可,除非不想让外界获取类地址- 普通对象
- const对象:需要在成员函数后面加const来保持权限一致
无法被子类继承的函数:构造函数,析构函数,赋值函数
参考
【C++要笑着学】运算符重载 | 赋值重载 | 取地址重载 | const成员
以下函数有什么区别
float Tensor<float>::index(uint32_t offset) const {
CHECK(offset < this->data_.size()) << "Tensor capacity is not enough!";
return this->data_.at(offset);
}
float& Tensor<float>::index(uint32_t offset) {
CHECK(offset < this->data_.size()) << "Tensor capacity is not enough!";
return this->data_.at(offset);
}
float Tensor<float>::index(uint32_t offset) const
第一个是普通成员函数添加了const关键字,使得如果类声明为const时,一样可以使用index函数,而不会出现权限问题
Tensor t1;
t1.index(1);
const Tensor t2;
t2.index(1); // 合法,如果index后面没有const,则此处调用index不合法
float& Tensor<float>::index(uint32_t offset)
函数返回引用,可以作为左值使用
这两个函数一个拥有函数签名const,另一个没有,所以算是重载index函数
去看侯捷视频!!!
Google test中CHECK的使用
参考资源:
GLOG从入门到入门
玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
常用函数
LOG()
LOG_IF()
// debug mode
DLOG()
DLOG_IF()
// CHECK series
CHECK()
CHECK_EQ()
CHECK_NE()
CHECK_LE()
CHECK_LT()
CHECK_GE()
CHECK_GT()
// compare string
CHECK_STREQ()
CHECK_STRNE()
CHECK_STRCASEEQ()
CHECK_STRCASENE()
// 详细日志
VLOG()