C++ 类
内容目录

类的形式

class Rectangle {
    int width, height;
  public:
    void set_values (int x,int y);
    int area() {return width*height;}
};

构造函数

class Rectangle {
  public:
    Rectangle() 
    {
        cout << "无参构造函数调用\n";
    }
    Rectangle(int a, int b) 
    {
        cout << "有参构造函数调用\n";
    }
};

int main () {
    Rectangle rect1; // 无参构造
    Rectangle rect1{}; // 无参构造
    Rectangle rest(); //函数声明
    Rectangle rect2(1, 2);

    Rectangle * a = new Rectangle; // 无参构造
    Rectangle * b = new Rectangle();// 无参构造
    Rectangle * c = new Rectangle{};// 无参构造
    Rectangle * d = new Rectangle(1, 2);// 有参构造
    Rectangle * e = new Rectangle{1, 2};// 有参构造

  return 0;
}

比较易混淆的点:

class Rectangle {
  public:
    Rectangle()  // 使用了带默认值的有参构造,无参构造函数应该删除
    {
        cout << "无参构造函数调用\n";
    }
    Rectangle(int a = 3) 
    {
        cout << "有参构造函数调用\n";
    }
};

如果只有有参构造,则需要自定义无参构造

类的初始化

    Rectangle rect2{1, 2};
    Rectangle rect3(1, 2);
    Rectangle rect4 = {1, 2};
    Rectangle rect5 = Rectangle(1, 2);

运算符重载

class  Vec{
public:
    Vec() {};
    Vec(int x, int y) : x{x}, y{y} {};

    Vec operator+(const Vec & other)
    {
        std::cout << "成员";
        return Vec(x + other.x, y + other.y);
    }

    friend Vec operator+ (const Vec& lhs, const Vec& rhs);
    void print()
    {
        std::cout << "x: " << x << ", y: " << y << " \n";
    }

private:
    int x, y;
};

拷贝构造函数和拷贝赋值函数

class  Vec{
public:
    Vec() {};
    Vec(int x, int y) : x{x}, y{y} { std::cout << "默认构造函数调用\n"; };

    Vec(const Vec&)
    {
        std::cout << "拷贝构造函数调用\n";
    }

    Vec& operator= (const Vec&)
    {
        std::cout << "拷贝赋值调用\n";
        return *this;
    }
    void print()
    {
        std::cout << "x: " << x << ", y: " << y << " \n";
    }

private:
    int x, y;
};

int main()
{
    Vec a{1, 2};
    Vec b{3, 4};
    Vec c(a); // 拷贝构造函数调用
    Vec d = a; // 拷贝构造函数调用
    d = c; // 拷贝赋值函数调用

    return 0;
}

移动构造和移动赋值

class  Vec{
public:
    Vec() {};
    Vec(int x, int y) : x{x}, y{y} { std::cout << "默认构造函数调用\n"; };
    Vec (Vec&& a)
    {
        std::cout << "调用移动构造函数\n";
    }

    Vec& operator= (Vec&& a)
    {
        std::cout << "移动赋值调用\n";
        return *this;
    } 
private:
    int x, y;
};

Vec get()
{
    Vec t(1, 2);
    return t;
}
int main()
{
    Vec a{1, 2};
    Vec b{3, 4};
    Vec c(std::move(a)); // 调用移动构造函数
    Vec c = std::move(a); // 调用移动构造函数
    Vec d;
    d = std::move(c);  // 调用移动赋值函数
    return 0;
}

由于RVO(返回值优化),默写情况下移动构造函数不会调用,例如

Vec c = get(); // 这里get返回的是一个Vec实例
Vec d;
d = get(); // 这里会调用移动赋值

但是函数返回值可以调用移动赋值

上一篇
下一篇