目录
一、拷贝构造
1.
拷贝构造函数是什么?什么时候用它
一个构造函数的第一个参数是自身类 ,(人拷贝人,猪拷贝猪)且其他参数都有默认值
(1)一个对象作为函数参数,以值传递的方式传入函数体;
(2)一个对象作为函数返回值,以值传递的方式从函数返回,非引用;
(3)一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
(4)用花括号列表初始化一个数组中的元素或一个聚合类成员。
如果没有写拷贝构造函数,对一个用new出来的对象,编译器会进行复制默认只修改指针,也称 “ 浅拷贝 ” ,会造成内存泄漏和别名危险
#include <string>
using std::string;
|'用一个SString类构造一个SString类'
SString::SString(const SString & str)
{
m_data = new char[strlen(str.m_data) +1];
strcpy(m_data, str.m_data);
}
SString s1("hello world");
SString s2(s1);
|s2与s3都是由构造函数而来,因为s3是新的对象,需要构造
SString s3 = s1;
2. 直接初始化和拷贝初始化的区别?
显式调用各版本的构造函数就是直接初始化,利用函数匹配
拷贝初始化发生于未显式调用构造函数但是却生成了类的对象的场合,比如函数返回值等场合。
二、拷贝赋值
1. 先清空自己,再创建一个与想copy的对象相应大小的空间,再拷贝过来
SString& SString :: operator = (const String& str)
{
//检测自我赋值,如果不检测先delete值,就无法存取了
if(this == &str)
return *this;
delete[] m_data;
m_data = new char[strlen(str.m_data)+1];
//+1是因为还要加上'\0'
strcpy(m_data,str.m_data);
return *this;
}
2. 重载运算符:本质上是函数,有返回类型和参数列表
三、析构函数
1. 用来写在变量和清理使用过的内存,new delete,栈的使用释放都会使用到析构。析构函数会在main函数执行完后,开始调用,样式是 “ ~ ” 加上类名,和构造函数对应
无返回值,无参数 -> 只有一个,不可以被重载
四、运算符重载
1. 运算符就是一个函数,定义形式是 “ return type ” operator" 符号 "()
2. C++标准规定,不能重载的运算符有:
类属关系运算符“ . ” 成员指针运算符“ .* ” 作用域分辨符“ :: ” 三目运算符“ ?: ”
。必须重载为成员函数的运算符有:赋值运算符“=”、取下标运算符“[]”、成员访问运算符“->”和函数运算符“()”。
3.
一个重载的函数调用运算符应该接受几个运算对象?
可以接受的对象为0-256个。
4. 对于成员访问运算符,解引用符“ * ” 可以任意指定任何操作,但是箭头运算符“ -> ”不可以丢掉成员访问的含义
对于 point“ -> ”mem,point必须得是
(1)类对象的指针 相当于(*point).mem
(2)一个重载了operator“ -> ”的类对象 相当于point.operator() -> mem
5. ()是函数调用符,必须得是类内的成员函数;定义了调用运算符的类,被称作函数对象
6. type()类型转换运算符,e.g:int( ),可以把一个类转化成其他的类型