`
aigo
  • 浏览: 2687703 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

C++中new 一个对象的时候加括号和不加括号的区别

C++ 
阅读更多

 

 

转载自:http://blog.csdn.net/ymqq1/article/details/8899184

 

 先把结论放上来:

 1,加括号调用没有参数的构造函数,不加括号调用默认构造函数或唯一的构造函数,看需求

,2,C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。

 

以下代码:

#include <iostream>

using namespace std;

int main()
{
    int *a=new int[1000];
    for(int i=0;i<1000;i++){
        a[i]=i+1;
    }
    delete[] a;
    int *b=new int[1000];
    for(int i=0;i<100;i++){
        cout<<b[i]<<endl;
    }

    return 0;
}

 

没有初始化,输出的结果是:

9437380

9443448

3

4

5

6

。。。

可见,new操作符并没有对内存进行初始化。

而稍微改变一下代码(在new之后添加括号()):

#include <iostream>

using namespace std;

int main()
{
    int *a=new int[1000];
    for(int i=0;i<1000;i++){
        a[i]=i+1;
    }
    delete[] a;
    int *b=new int[1000]();
    for(int i=0;i<100;i++){
        cout<<b[i]<<endl;
    }

    return 0;
}

 

输出结果为:

0

0

0

0

。。

可见,已经进行了初始化。

 =============================================================================

进一步思考:

定义类A:

class A{
public:
    int a;
    A():a(10){};
};

 

main函数中使用语句:

A *b=new A;
cout<<b->a<<endl;

A *b=new A();
cout<<b->a<<endl;

 

输出结果都是10,可见都进行了初始化。

但是,如果吧A的构造函数删掉,则两个语句输出的结果分别是:随机数,0。

 

由此可见,C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。

PS: 修改参考:http://bbs.csdn.net/topics/320161716

分享到:
评论

相关推荐

    详谈构造函数加括号与不加括号的区别

    这两者的区别在于,加括号的调用是在构造函数之外执行一个函数,而不加括号的调用则是在新创建的对象上执行方法。这种差异可能导致不同的行为,尤其是在`this`关键字的上下文和函数执行顺序上。 此外,如果`getName...

    C++表达式括号匹配配对判断问题

    在C++编程中,一个算法中可能包含圆括号和方括号两种括号,设计判别表达式中括号是否正确匹配的算法。 2. 基本要求 (1)表达式用字符串表示,以初始化方式创建或以交互方式创建。 (2)借助栈进行算法设计。 ...

    用new创建对象和直接定义的区别

    `new`关键字在Java、C++、C#等面向对象语言中广泛使用,它用于在堆内存中动态分配空间并初始化一个新对象。当我们使用`new`关键字时,通常会伴随着一个类的构造函数调用,以便对新对象进行初始化。 ```java // Java...

    设计一个算法判别一个算术表达式的圆括号是否正确配对

    根据给定的文件信息,本篇文章将详细解析如何设计一个算法来判断算术表达式中的圆括号是否正确配对,并结合Java语言实现这一算法。 ### 设计算法 #### 问题描述 对于一个算术表达式,我们需要设计一个算法来判断...

    C++面向对象复习资料

    5. **动态内存管理**:new运算符用于动态创建对象和对象数组,并调用构造函数。使用delete运算符释放由new创建的对象或数组,遵循“谁创建,谁释放”的原则。 6. **命名空间(namespace)**:命名空间用于避免全局...

    C++课件 C++类与对象

    `this`指针是C++中的一个重要概念,它是一个隐含的指针参数,存储了调用成员函数的对象的地址。在成员函数内部,`this`可以用来访问当前对象的成员,例如`this-&gt;x`或`(*this).x`。在示例代码中,`setXY`函数中的`x`...

    C++课程-2_类与对象

    继承是面向对象编程中的另一个重要特性,允许一个类(派生类)继承另一个类(基类)的属性和方法。这有助于代码重用和扩展。多态是指同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行效果,通常通过...

    Overview of the New C++ (C++0x)

    - **描述:“c++ 0x 比较新的一个ppt,可用来和旧版的c++作一下对比学习”**:这段描述强调了文档的主要目的是帮助读者通过比较新旧版本来理解C++0x的变化。这表明文档包含的内容将聚焦于新特性的介绍以及它们如何与...

    第六章 类和对象(计算机等级考试二级C++).pdf

    在深入探讨C++编程语言的面向对象编程特点时,我们需要理解类和对象的相关概念。C++是一种支持面向对象的编程语言,而面向对象编程(OOP)的中心思想是将数据以及与数据相关的操作封装在一起,形成对象,以解决特定...

    C++对象初始化[文].pdf

    C++对象初始化是编程过程中一个至关重要的概念,它涉及到如何为新创建的对象赋予初始值。在C++中,对象初始化可以分为两类:初始化和赋值,它们之间有着本质的区别。 初始化是在创建对象的同时为其赋予初始值,而...

    面向对象C++填空题PDF

    6.在C++中,访问一个指针所指向的对象的成员所用的指向运算符是-&gt;。 7.假如一个类的名称为MyClass,使用这个类的一个对象初始化该类的另一个对象时,可以调用复制或拷贝构造函数来完成此功能。 8.对赋值运算符进行...

    C++课件--C++、C语言、对象与类

    在C++中,对象和类是OOP的核心元素。本课件旨在帮助学习者深入理解C++,特别是关于C语言、对象与类的知识。 首先,对象是现实世界实体的抽象,它们具有独特的身份、状态和行为。状态指的是对象的数据字段,即对象的...

    C++new 用法

    1. new() 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量。 例如:`char* p = new char('A');` 这里分配了一个 char 类型的内存空间,并将其初始化为 'A'。 2. new[] 分配这种类型的 n 个大小...

    c++11c++14综述

    R值引用和移动语义是C++11中最重要的特性之一,它解决了C++中常见的性能问题——不必要的对象复制。通过引入移动构造函数和移动赋值操作符,可以将一个临时对象(右值)的所有权转移给另一个对象,从而避免昂贵的...

    C++ 常见99个错误

    本资料"《C++ 常见99个错误》"针对C++编程中常见的99个错误进行了详尽的分析,旨在帮助程序员避免这些陷阱,提高代码质量和效率。 1. **语法错误**:这是初学者最容易犯的错误,例如括号不匹配、缺少分号或关键字...

    新手学习C++入门资料

    标准C++的iostream类库中包括了可以支持宽字符的类和对象。用wout替代cout即可。 #include iostream.h int main() { wchar_t wc; wc='b'; wout; wc='y'; wout; wc='e'; wout; return 0; } 说明一下...

    c/c++ 面试题目整理

    总结来说,文档中提到的知识点涵盖了C/C++内存管理、面向对象编程特性、继承与多态性等多个方面,这些都是C/C++编程面试中经常会涉及到的基础和深入知识点。掌握了这些知识点,无疑会对面试的成功带来积极影响。

    面向对象C++选择题.docx

    面向对象的C++编程语言是现代软件开发中的一个重要工具,其特性包括类、对象、封装、继承、多态等核心概念。以下将根据题目提供的部分知识点进行详细解释: 1. **函数原型**:函数原型是函数声明的一种形式,用于...

    c++面向对象程序设计模拟试题一

    但从已知代码来看,该程序定义了一个`CTest`类,构造函数中对一个计数器进行了递增操作,可以推断出这部分代码可能涉及到对象的创建和析构过程。 以上是对给定的C++面向对象程序设计模拟试题的知识点解析,希望...

    C++面经整理发布版.pdf

    C++中引入new/delete,是因为它们能够处理对象的构造和析构,这是C语言中malloc/free所不具备的功能。 C++与C的区别在于,C++支持面向对象编程,引入了类、封装、继承和多态等概念。而C是一种面向过程的编程语言。...

Global site tag (gtag.js) - Google Analytics