使用和不使用新运算符初始化对象

Initializing an object with and without new operator

本文关键字:初始化 对象 运算符      更新时间:2023-10-16

如果我有一个类Rectangle

class Rectangle{
private:
    double width;
    double height;

public:
void    Set(double w , double l){
    width   = w;
    height  = l;
}
};

我丢弃了一个对象,比如

Rectangle *Obj;

然后尝试初始化其属性:

Obj->Set(3,5);

编译器在运行时显示:The variable 'Obj' is being used without being initialized.

问题可以通过以下方式解决:

Rectangle *Obj=new Rectangle;

我会问一下原因!为什么编译器在编译时没有显示任何错误?

Rectangle *Obj;

只是定义了一个指向类Rectangle的对象的指针。定义指针不会为对象本身保留任何内存,只为指针保留内存。因此,如果您访问指针,您可能会在内存中找到一个甚至不属于您的进程的地址。但是,编译器无法知道您尚未初始化指针(此处的关键字为别名(,因此无法输出错误消息。

解决方案要么像您建议的那样使用new,要么像这样声明Rectangle的实例:

Rectangle Obj;

它将调用默认构造函数。然后,您可以使用设置您的会员

Obj.Set(3, 5);

我丢弃了一个对象,比如

Rectangle *Obj;

错误,这声明了指针,而不是对象。指针必须使用new或通过为其分配现有对象的地址来初始化。

Mmm有点困惑:

编译器在运行时显示:变量"Obj"在未初始化的情况下被使用

这就是所谓的编译时。只是把行话弄直了。

此外,最简单的方法是

Rectangle Obj;
Obj.Set(3,5);

这对于大多数场景都足够了,除了动态分配或多态容器:

std::vector<Shape*> v;
v.push_back(new Rectange());
v.back()->Set(3,5);
v.push_back(new Circle());
v.back()->Set(3,5);
//

尽管无论何时使用new,您也应该记住delete。这可能是一场噩梦(也有例外(。我建议:

std::vector<std::shared_ptr<Shape*> > v;
v.push_back(std::make_shared<Rectange>());
v.back()->Set(3,5);
v.push_back(std::make_shared<Circle>());
v.back()->Set(3,5);

使用Rectangle *Obj;,您声明了一个指向矩形的指针,但还没有告诉Obj它应该指向哪个矩形。您可以稍后将Obj设置或实例化为现有的Rectangle,或者仅在需要时设置或实例化。

C++就是让你精确地控制你的内存和性能。事实上,这就是它在一些嵌入式环境中使用的原因!自动实例化Obj会引发的几个"问题">

  • 我们什么时候可以释放Obj
  • 谁释放Obj
  • 在堆上创建Rectangle对性能的影响如何
  • 这是一个我们有足够资源(内存、CPU等(来创建矩形的环境吗,尤其是当它很大的时候
  • 你是否将Obj的地址传递到某个地方,然后通过一些我们无法静态分析的复杂方法在运行时实例化它

您所做的不是语法错误,而是编译器在编译时抛出的错误。分析器(内置于Visual Studio 2010专业版中(可能会警告您正在使用未初始化的变量,尽管这是可选的,您可能需要打开它。

没有new的指针正在声明没有内存的东西。。所以你必须使用new和指针。然而矩形矩形;将默认分配内存。

为了对此进行检查,在Rectangle类中创建一个构造函数,如

void Rectangle
{
  cout<<"Rectangle Constructor";
}

然后,在主中

Rectangle *rect; -->>O/P  -- "Nothing"
Rectangle rect2; -->>O/P  -- Rectangle Constructor
rect=new Rectangle; -->>O/P  -- Rectangle Constructor

为什么编译器在编译时没有显示任何错误?

因为,它在语法上是正确的。但是,这样的语句将导致未定义的行为,智能编译器将始终发出警告。

在g++中,您可以将此类编译器警告转化为错误。

语句矩形*obj只是表示存在一个指针,该指针将指向矩形类型的变量。

使用此语句,您只是在创建一个指针而不是对象矩形的实例要使用该指针,必须将矩形类型变量的地址存储在指针中

两种方法是通过

obj=new rectangle;  //variable is created in the stack storage

rectangle r;
obj =&r;     //variable is created in the heap storage