栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++中的构造函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++中的构造函数

C++中默认构造函数和复制构造函数需要特殊理解。

目前来看,复制构造函数可能也会因为编译器的不同体现出不同的调用机制。

以下程序创建了一个只含有基本数据类型的类,可以一定程度上帮助你理解c++中的构造函数。



#include   // 需要使用std::cout、std::endl
using namespace std; // 将std::cout、std::endl分别缩写为cout和endl

//vec是向量vector的缩写,表示一个二位向量
//因为c++中有一个名为vector的模板,所以,不用那个名字
class vec{
    private:
        double x, y;
    public:

        // 默认构造函数,如果默认构造函数什么都不做的话等于没写(意思就是没写也行)
        
        vec() { cout << "Default constructor has constructed. "<< endl; }

        
        vec(double xx, double yy) : x(xx), y(yy) {
            cout << "A constructor has constructed (" << this->x << "," << this->y << "). " << endl;
        }

        // 复制构造函数(特征只有一个参数,是同类对象的引用或常引用,即vec &b或者是const dot &b)
        
        vec(const vec &b) : x(b.x), y(b.y) {
            cout << "Copy constructor has constructed (" << this->x << "," << this->y << "). " << endl;
        }

        //x,y属性是private,外界不能直接调用,也就是说声明vec a没法直接用a.x和a.y
        //于是你需要用a.X()和a.Y()来获取a的属性,至于为什么要这么蛋疼,这是学计算机面的搞面对对象变成才需要去搞懂的
        double X() { return this->x; }
        double Y() { return this->y; }

        //以下是对运算符的重载,如果不考的话你不需要了解,写这些是为了让二维向量更像二维向量
        vec operator+(vec AnotherVector) { return vec(this->x + AnotherVector.x, this->y + AnotherVector.y); }//加法
        vec operator-(vec AnotherVector) { return vec(this->x - AnotherVector.x, this->y - AnotherVector.y); }//减法
        vec operator+() { return *this; }//正号
        vec operator-() { return vec(-(this->x), -(this->y)); }//负号
        vec operator*(double times) { return vec(times * (this->x), times * (this->y)); }//右乘,即乘数只能在乘号右边
};


int main(int argn,char** agrv){
    //你可以直接用构造函数表示该类型变量的一个值:vec(1,2)表示二维向量(1,2),这就好像你可以用数字“1”表示一个int。
    // 如果说这样还有点抽象,你可以认为int a=1 和 vec b=vec(1,2)的意义是差不多的。
    vec a = vec(1, 2); //用(1,2)初始化a向量 你可以使用vec a(1,2);效果是完全一样的。
    cout << "line 65: a is (" << a.X() << "," << a.Y() << "). " << endl;
    // 每一个输出都写明了当前所在代码行数,观察确定行数之间的输出会更加清晰。


    vec b;        //等价于vec b();
    b = vec(3, 4);//给向量b赋值,可以注意到a和b做了一样的事情,构造函数调用却有区别,自然的,你在这里不可以用b(3,4)
    cout << "line 71: b is (" << b.X() << "," << b.Y() << "). " << endl;


    // 如果你能搞明白运算符重载,那就可以明白为什么这里调用了一次复制构造函数,否则不需要理解
    a = (-(+a) + (-vec(1, 2) + (+vec(2, 0)))) - b * 2; //这一行的代码是告诉读者:经过运算符重载后这样写是可以的,你可以用高中知识进行计算,看看是否相等
    cout << "line 76: a is (" << a.X() << "," << a.Y() << "). " << endl;


    a = b;
    cout << "line 80: a is (" << a.X() << "," << a.Y() << "). " << endl;
    cout << "line 81: b is (" << b.X() << "," << b.Y() << "). " << endl;

    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873474.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号