new T 与new T()的区别

本文探讨了在C++中使用new T()与new T这两种语法的不同效果。当T为类类型并定义了构造函数时,两者效果相同;若未定义构造函数,new T()会对成员变量进行值初始化;对于内置类型,new T()则进行值初始化。

①T *p =new T;

②T *p =new T();

这两类用法不同点的总结。

 

1.若T为类类型,且用户定义了构造函数,则两种形式的效果完全相同,都会调用这个定义了的构造函数来初始化内部成员变量,但是如果此构造函数中并未对成员变量初始化,则这个时候内部的成员变量进行默认初始化——值是未定义的。

2.若T为类类型,但是用户并没有定义任何构造函数,则我们可以知道编译器会为该类合成一个默认的构造函数,这个时候上述两种形式的结果就不同了,①的类内部的成员变量这个时候执行默认初始化,其值是未定义的。但是在②中就不同了,加了括号后,p内部的成员变量会执行值初始化,即以0的形式进行初始化(整数就为0,bool就为false,string 就为空)

3.若T为内置类型,则①的形式中*p的值为未定义的,②中进行值初始化如上。


原文地址:http://blog.youkuaiyun.com/iaccepted/article/details/38613089

代码 `T *p = new T` 的含义是在堆上动态分配一个类型为 `T` 的对象,并将该对象的地址赋值给指针 `p`。这是 C++ 中使用 `new` 操作符进行动态内存分配的一种常见方式。 在 C++ 里,`new` 操作符的主要作用是在堆上分配内存,并且会调用对象的构造函数来初始化这块内存。在 `T *p = new T` 中,`T` 是类型名,`p` 是指向 `T` 类型对象的指针。当执行这行代码时,系统会在堆上分配足够的内存以存储一个 `T` 类型的对象,接着调用 `T` 的默认构造函数对该对象进行初始化,最后把这块内存的地址赋值给指针 `p`。 下面结合引用 [1] 中的内容,给出一个示例代码,展示 `new` 操作符的使用: ```cpp #include <iostream> class A { public: A(int a = 0) : _a(a) { std::cout << "A constructor called with value: " << _a << std::endl; } ~A() { std::cout << "A destructor called" << std::endl; } private: int _a; }; int main() { // 使用 new 操作符在堆上分配一个 A 类型的对象 A *p = new A(10); // 使用完对象后,需要使用 delete 操作符释放内存 delete p; return 0; } ``` 在上述代码中,`A *p = new A(10)` 在堆上分配了一个 `A` 类型的对象,并调用了 `A` 的构造函数,传入参数 `10`。当不再需要该对象时,使用 `delete p` 释放了这块内存,同时调用对象的析构函数。 `T *p = new T` 的使用场景包括: - **动态数组**:当需要在运行时确定数组的大小时,可以使用 `new` 来动态分配数组。例如:`int *arr = new int[n];`,这里的 `n` 可以是在运行时才确定的变量。 - **对象生命周期管理**:当对象的生命周期需要由程序员手动控制时,使用 `new` 分配内存,在合适的时候使用 `delete` 释放内存。比如,在开发一个复杂的系统时,可能需要在某个模块中创建对象,在其他模块中销毁对象。 - **多态性**:在使用多态时,通常需要通过基类指针指向派生类对象,而这些对象往往是通过 `new` 动态分配的。例如:`Base *p = new Derived();`,这样可以实现运行时的多态调用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值