一.构造函数总结
构造函数是c++中用于初始化对象状态的特殊函数
构造函数在对象创建时自动被调用(默认调用),隐身调用
构造函数和普通成员函数都遵循重载规则
拷贝构造函数是对象正确初始化的重要保证
必要时,必须手工编写拷贝构造函数
二.构造函数的应用
自动调用:一般情况下,c++编译器会自动调用构造函数
手动调用:在一些情况下则需要手工调用构造函数
三.构造函数有三种
有参构造函数,默认构造函数,拷贝构造函数
四.有参构造函数调用的三种方法
class Test
{
public:
//有参构造函数
Test(int a)
{
m_a=a;
}
//无参构造函数
Test()
{
m_a=0;
}
//四中应用场景
//赋值构造函数 copy构造函数
Test(const Test &obj)
{
}
public:
void print()
{
cout<<"m_a"<<m_a<<endl;
}
protected:
private:
int m_a;
};
void main()
{
//括号法
Test t1(10);//c++编译器自动调用这个类的有参构造函数
t1.print();
//=
Test t2=20;//c++编译器自动调用这个类的有参构造函数
t2.print();
//
Test t3=Test(30);//程序员手工的调用构造函数,进行对象的初始化
t3.print();
system("pause");
}
构造函数用来完成对象的构造(初始化)工作。
五.赋值构造函数(copy构造函数)和=操作是两个不同的概念
赋值构造函数(copy构造函数)的四个应用场景
void main()
{
Test t1;
t1.setA(10);
Test t3;
//copy构造函数第一种场景
1.赋值构造函数和=操作是两个不同的概念
2.赋值构造函数 copy构造函数,也是构造函数
Test t2=t1;//对象t2的初始化
cout<<t2.getA()<<endl;
//在这个场景下,t2被创建,并且自动的调用copy构造函数
3.当我们没有编写copy构造函数(赋值构造函数)时,c++编译器对自动为我们提供一个copy构造函数,执行的是浅copy
t2=t2;//是对象的=操作
system("pause");
}
//copy构造函数第二种场景
void main()
{
Test t1;
t1.setA(10);
Test t2(t1);
system("pause");
}
//copy构造函数第三种场景
#include "iostream"
using namespace std;
class Location
{
public:
Location( int xx = 0 , int yy = 0 )
{X = xx ; Y = yy ; cout << "Constructor Object.\n" ;}
Location( const Location & p ) //复制构造函数;拷贝构造函数
{X = p.X ; Y = p.Y ; cout << "Copy_constructor called." << endl ; }
~Location() { cout << X << "," << Y << " Object destroyed." << endl ; }
int GetX () { return X ; }
int GetY () { return Y ; }
private : int X , Y ;
} ;
void f ( Location p )
{
cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;
}
void playobjmain()
{
Location A ( 1, 2 ) ;
f ( A ) ;
}
int main()
{
playobjmain();
//system("pause");
return 0;
}
//copy构造函数第四种应用场景
#include "iostream"
using namespace std;
class Location
{
public:
Location( int xx = 0 , int yy = 0 )
{
X = xx ; Y = yy ; cout << "Constructor Object.\n" ;
}
Location( const Location & p ) //复制构造函数
{
X = p.X ; Y = p.Y ; cout << "Copy_constructor called." << endl ; }
~Location() { cout << X << "," << Y << " Object destroyed." << endl ; }
int GetX () { return X ; } int GetY () { return Y ; }
private : int X , Y ;
} ;
void f ( Location p )
{
cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;
}
// void playobjmain()
// {
// Location A ( 1, 2 ) ;
// f ( A ) ;
// }
Location g()
{
Location A(1, 2);
return A;
}
void main101()
{
Location B;
B = g();//g()返回一个匿名对象
}
int main()
{
main101();
//system("pause");
return 0;
}