如下定义一个类:
class A{
}; 函数体内不定义任何构造函数,编译器会默认生成拷贝构造函数,不带参数的默认构造函数以及赋值构造函数
赋值构造函数型如:
A& operator=(const A& object);
下面例子完全可以通过编译器:
#include "stdafx.h"
class A{
};
void main()
{
A a; //调用默认构造函数
A b(a); //调用拷贝构造函数
b = a; //调用赋值构造函数
}
example:
// utest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class A{
public:
A(int val):value(val)
{
//value = val;
}
void display()
{
cout<<"value:"<<value<<endl;
}
private:
int value;
};
void main()
{
A a(2);
A b(a);
a.display();
b.display();
b = a;
b.display();
}
结果:
value:2
value:2
value:2
请按任意键继续. . .
屏蔽掉编译器自动生成函数的两种方法:
1. 将拷贝构造函数或者赋值构造函数申明为私有方法,并不要定义
2. 利用类的继承实现
1.
// utest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class A{
public:
A(int val):value(val)
{
//value = val;
}
void display()
{
cout<<"value:"<<value<<endl;
}
private:
int value;
A(const A&); //声明私有拷贝构造函数
A& operator=(const A&); //申明私有赋值构造函数
};
void main()
{
A a(2);
A b(a); //编译出错
a.display();
b.display();
b= a; //编译出错
b.display();
}
2.
// utest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class base{
protected:
base(){}
~base(){}
private:
base(const base&);
base& operator=(const base&);
};
class A:public base{
public:
A(int val):value(val)
{
//value = val;
}
void display()
{
cout<<"value:"<<value<<endl;
}
private:
int value;
};
void main()
{
A a(2);
A b(a);
a.display();
b.display();
b= a;
b.display();
}