• C++初始化和赋值的区别


    普通情况下,初始化和赋值好像没有什么特别去区分它的意义。

    int a=100;和int a;a=100间仿佛没有任何区别,但是当c++中引入类后,情况变得有些复杂。

    首先理清下构造函数的一些东西。

    关于构造函数,前面有两篇随笔写了默认构造函数和拷贝构造函数,其实还包括参数为一些成员变量属性的构造函数,现在自己理一下,这两个东西,他们只是参数不同,也就是说只是使用他们的方式不同。默认构造函数是不传参,构建的对象默认的使用那些值赋值给成员变量;而拷贝构造函数是接受一个相同类的另一个对象,使用该对象来逐成员的为自己的成员赋值;其他的一些构造函数也是如此,他们只是走的路线不同,最终目的都是为构建的一个对象进行初始化。

    也就是说,构造函数的目的,是服务于类的初始化的,它并不服务于赋值。赋值是独立于初始化之后的操作。

    这么讲比较抽象,举一个栗子:

    例子转自:https://blog.csdn.net/qq_38211852/article/details/80629691

    #include <iostream>
    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 = "<<p1.x<<" "<<"p1.y="<<p1.y<<endl;   
        cout<<"p2.x = "<<p2.x<<" "<<"p2.y="<<p2.y<<endl;  
        return 0;   


    这个类重载了“=”号。重点在于main函数中。

    从结果我们观察到:

    并不像我们想象的那样p1为(2,2),p2也为(2,2)。

    这正是初始化与赋值的区别。

    在p1中,Point p1=p;这个操作中,实际上是通过一种类似于拷贝构造函数中逐member的方式(但并没有生成一个拷贝构造函数,生成拷贝构造函数的四种情况见前面的随笔),并没有调用重载的"="运算符。所以最终结果是p1为(1,1)。

    而在p2中,初始化与赋值是分开的,Point p2;就已经完成了初始化,这个初始化是通过定义的含参构造函数(但是以a=0,b=0的默认值完成的)。

    然后在调用重载运算符,对p中成员均自加后赋值给p2的成员变量。

  • 相关阅读:
    VC 多文档用户界面设计
    如何把Windows7 库 更改成 我的电脑
    解决多文档程序框架中建立新的子框架类后出现“创建空文档失败”的问题
    我们从UNIX之父Dennis Ritchie​身上学到了什么
    在Unicode环境下读出和写入文件
    Android活动的生命周期
    Godaddy 上的域名服务器状态查询
    v8 javascript SHELL
    vim E492: Not an editor command: ^M
    Ubuntu 11.10不能使用USB安装的解决方法
  • 原文地址:https://www.cnblogs.com/lxy-xf/p/11049963.html
Copyright © 2020-2023  润新知