使用和不使用新运算符初始化对象
Initializing an object with and without new operator
如果我有一个类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
- C++使用整数的压缩数组初始化对象
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 在 c++ 中初始化对象
- C++ 手动分配和初始化对象
- 使用运算符"="在C++中用值初始化对象
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 如何初始化对象数组?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 在 c++ 中复制对未初始化对象的引用
- 在成员变量在另一个文件中发生更改后,调用与初始化对象分开的函数
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 当您通过分配初始化C 对象时会发生什么
- 获取未初始化对象成员的地址是否定义良好?