使用Constructor参数实例化类对象与使用不带参数C ++的*运算符之间的区别

时间:2016-07-06 15:18:37

标签: c++ constructor polymorphism default-constructor

在使用C ++学习OOPS概念时,我遇到了这个教程链接。 http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm

在基类Shape中,它有两个参数的构造函数来设置其受保护的变量,在main()中,我认为为类Shape创建对象的唯一方法是通过执行像Shape shape(2,4)这样的东西来匹配Shape类中的构造函数。

有人可以说没有任何参数的实例化Shape *shape如何工作,并且说明了Shape shape(2,4)Shape *shape之间创建对象的区别。

#include <iostream>

using namespace std;

class Shape{
protected:
    int w,h;

public:

    Shape(int a, int b){
        w=a;
        h=b;
    }
    int area(){
        cout << "Shape class area" << endl;
        return 0;
    }
};

class Rect:public Shape{

public:

    Rect(int a, int b):Shape(a,b) {}
    int area(){
        cout <<"Rect class area " << endl;
        return w*h;
    }
};

class Tri:public Shape{

public:

    Tri(int a, int b):Shape(a,b) {}
    int area(){
        cout << "Tri class area" << endl;
        return (w*h)/2;
    }
};

int main(){

    Shape *shape;
    Rect r(4,5);
    Tri t(4,5);
    shape=&r;
    shape->area();
    shape=&t;
    shape->area();
    return 0;
}

3 个答案:

答案 0 :(得分:1)

Shape *shape;

这不会创建Shape对象。它创建一个未初始化的Shape指针,该指针可用于存储Shape对象(或从Shape派生的类的对象)的地址。您可以在链接到的页面中看到它:

// store the address of Rectangle
shape = &rec;
// call rectangle area.
shape->area();

答案 1 :(得分:1)

声明

Shape *shape;

不会创建类Shape的任何实例。 它声明了一个变量,它是一个Shape *类型的指针,如果声明声明了一个局部变量,那么它没有被初始化,因为它具有不确定的值。

对于构造函数,那么具有两个参数的类的唯一构造函数也是该类的默认构造函数,因为每个参数都有一个默认参数。

Shape( int a=0, int b=0)
           ^^^      ^^^  
{
   //...
}

因此你可以写例如

Shape sh;

将使用这些默认参数初始化创建的对象的数据成员。 该声明等同于

Shape sh( 0, 0 );

答案 2 :(得分:0)

声明Shape*不是运算符,它是一种不同的类型。类型是指向形状的指针。这与通过多种方式直接声明形状不同:

  • 它不是形状,而是指向形状的变量。
  • 使用继承时,我们可以使用指向基类(Shape*)的指针指向子类(Rectangle)。
  • 请注意,我没有在*之后添加Rectangle。这是因为指针指向一个类的实例,而不指向另一个指针,除非你有指向指针的指针。
  • 声明Shape*时,不会调用构造函数,因为您的指针将使用new运算符指向现有实例或新实例,或者不指向任何实例。
  • 指向任何内容的指针通常称为空指针。
  • 你应该在多态之前阅读关于指针和引用的内容。

没有参数声明的指针具有未定义的值。如果你想要一个空指针,你应该这样声明:

Shape* ptrToShape = nullptr;