1.c 中, 对于简单类型的赋值和初始化的区别基本可以忽略
2.当涉及到类或者复杂的数据类型时,问题就变得不那么简单了,下面以一个例子来引入话题:
#include
using namespace std;
class point
{
public:
point(int a=0, int b=0):x(a), y(b){};
~point(){
};
point& operator =(const point &rhs);
int x;
int y;
};
point& point::operator =(const point &rhs)
{
x = rhs.x 1;
y = rhs.y 1;
return *this;
}
int main(void)
{
point p(1,1);
point p1 = p; //初始化操作
point p2;
p2 = p; //赋值操作
cout<<"p1.x = "<
}
运行结果如下:
可以看到赋值操作和初始化操作打印的结果,只在赋值操作中调用了重载“=”的函数。
而在初始化中的“=”调用的是默认的构造函数
为了证实初始化中的“=”调用的是默认的构造函数,我们可以做如下处理:
根据effctive c 条款05描述,定义了一个空类,如果没有声明,系统自动会声明一个默认构造函数,复刻构造函数,析构函数,和一个运算符重载函数。
class empty{};
就好像你写下如下代码:
class empty{
public :
empty(){..}
empty(const empty&rts){...}
~empty() {...}
empty &operator=(const empty &rts){...}
}
条款06又描述了如不想使用编译器自动生成的函数,就该明确拒绝,具体做法是将相应的成员函数声明为private并且不予实现,因此上述的程序可以改成这样。
#include
using namespace std;
class point
{
public:
point(int a=0, int b=0):x(a), y(b){};
~point(){
};
point& operator =(const point &rhs);
int x;
int y;
private:
point(const point &p);
};
point& point::operator =(const point &rhs)
{
x = rhs.x 1;
y = rhs.y 1;
return *this;
}
int main(void)
{
point p(1,1);
point p1 = p; //初始化操作
point p2;
p2 = p; //赋值操作
cout<<"p1.x = "<
}
这个时候就会报错,因为需要调用复刻构造函数,但是它没有实现
tips:有如下来两种情况,只能用初始化,而不用赋值
1.对于const和reference 类型的成员变量,只能用初始化列表形式
2.类的构造函数需要调用基类的构造函数的时候
构造函数与赋值函数的区别
1.复刻构造函数是一个对象来初始化一块内存区域,这块内存就是新对象的内存区
2.复刻构造函数式复制指针对象,赋值函数是引用指针对象
3.实现方式不一样,复刻构造函数首先是一个构造函数,它调用的时候好似通过参数传进来的那个对象来初始化一个对象,赋值函数就是一个已经初始化的对象来进行operator=操作