2016-07-06 25 views
1

在C++中学习OOPS概念时,我遇到了本教程链接。 http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm使用Constructor参数实例化一个类对象与不带参数的*运算符之间的区别C++

在基类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; 
} 
+2

显示你的代码。 –

+0

与其依靠人们阅读链接的文章(当数年后有人发现此问题时可能不存在),请将相关代码示例作为问题的一部分发布,以便我们可以自行理解它。堆栈溢出不仅仅是为了你现在需要的答案,而是其他人未来的相同问题。 –

+0

道歉。在上面的第一个问题中添加了代码。谢谢 – Gangadhar

回答

1

声明

Shape *shape; 

不创建类形状的任何实例。 它声明了一个变量,该变量是类型为Shape *的指针,并且未被初始化,即它具有不确定的值,前提是该声明声明局部变量。

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

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

因此可以写例如被创建的对象的

Shape sh; 

和数据成员将被这些默认参数进行初始化。 此声明等效于

Shape sh(0, 0); 
+0

谢谢!我很快在上述程序中添加了代码。 形状sh; sh.area()//这给了我一个错误,说没有匹配的构造函数 而我写的时候 Shape sh(0,0); sh.area()//它能够正确访问方法 我误解了你的答案。请澄清。谢谢!! – Gangadhar

+0

@Gangadhar代码与引用中显示的代码不对应,因为Shape类的构造函数现在不是默认的构造函数。它的参数没有默认参数。 –

+0

非常感谢您的澄清。我看到你提到的区别。 – Gangadhar

1
Shape *shape; 

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

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

所以这意味着。如果我们想要一个Shape类的对象,它应该分别实例化,并且不能重复使用相同的*形状? – Gangadhar

+0

@Gangadhar:我不明白你的意见。 –

+0

所以如果我的班级形状有另一种方法说 void print(){cout <<“Print something”; } 我可以做shape.print()之类的东西吗?还是我需要为Shape类实例化一个不同的对象? – Gangadhar

0

声明一个Shape*不是一个运营商,这是一个不同的类型。该类型是指向形状的指针。这与以多种方式直接声明形状不同:

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

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

Shape* ptrToShape = nullptr; 
+0

非常感谢 – Gangadhar

相关问题