C++中构造函数有三类
- 无参构造函数
Test2() //无参数的构造函数
{
m_a = 0;
m_b = 0;
cout<<"无参构造函数"<<endl;
}
- 有参构造函数
- 代码形式
Test2(int a)
{
m_a =a;
m_b = 0;
cout<<"有参构造函数1"<<endl;
}
Test2(int a,int b) //无参数的构造函数
{
m_a = a;
m_b = b;
cout<<"有参构造函数2"<<endl;
}
- 调用有参构造函数的三种方式:
2.1) 括号法
Test2 t1(1,2);
2.2) 等号法
Test2 t2 = (3,4);
2.3) 直接调用构造函数或者程序员手工调用产生一个对象
Test2 t3 = 5;
- 赋值构造函数
- 代码
//赋值构造函数 copy构造函数
Test2(const Test2& obj) //无参数的构造函数
{
cout<<"我也是构造函数"<<endl;
}
- 调用拷贝构造函数的方法:
2.1) 定义变量并初始化括号法
Test2 t6(t1);
2.2) 定义变量并初始化,初始化法
Test2 t5 = t1;
2.3) 匿名对象初始化另外一个同类型的对象,直接把匿名对象转成t6,即匿名变有名不会被析构掉
Test2 t6 = Test2();
2.4) 匿名对象赋值给另外一个同类型的对象,然后匿名对象析构
Test2 t2(1,2);
t2 = Test2();
深拷贝和浅拷贝
浅拷贝:两个指针变量指向同一块内存空间.当析构函数把obj2的内存空间析构之后,obj1就变成野指针。
//构造函数
Name(const char *myp)
{
m_len = strlen(myp);
m_p = (char *)malloc(m_len +1);
strcpy(m_p,myp);
}
//调用构造函数
Name obj2 = obj1;
深拷贝:自己写拷贝构造函数
Name(const Name& obj1)
{
m_len = obj1.m_len;
m_p = (char *)malloc(m_len +1);
strcpy(m_p,obj1.m_p);
}
image.png
- 作用域解析运算符
在类声明和类方法之外使用成员函数时,使用作用域解析运算符(::)来标识函数所属的类;
例如:update()成员函数的函数头如下:
void Stock::update(double price)
这种表示法意味着定义的update()函数是Stock类的成员。这不仅将update()标识为成员函数,还意味着可以将另一个类的成员函数也命名为update(),因此,作用域解析运算符确定方法定义对应类的身份。
- 声明的私有成员只能通过成员函数进行访问。
- 为了避免参数名与类成员相同,则在数据成员名中使用m_前缀或者在成员名中使用后缀_。
- 构造函数用来创建对象,而不是通过对象来调用
网友评论