C++中初始化和定义对象的语法,带括号与不带括号的区别

本文详细探讨了C++中构造函数的使用,包括默认构造函数和带参数构造函数的调用过程。通过实例展示了不同构造函数如何初始化类成员变量,并对比了直接初始化与赋值方式的区别。

小记:运行环境:win xp  vs2008

#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::istream;
using std::ostream;

class y
{
private:
    int a;
public:
    y(){ cout << "y()" << endl;}
    y(int n){cout << "y(int n)" << endl; a = n;}
    int GetA(){return a;}
};

int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;

    y *py = new y();    // 调用y(),不论 y(int n) 一般构造函数是否存在
    cout << py->GetA() << endl;        // 任意值
    y *py2 = new y;        //  调用y(),不论 y(int n) 一般构造函数是否存在
    cout << py2->GetA() << endl;    // 任意值
    y *py3 = new y(222);    // 调用 y(int n)
    cout << py3->GetA() << endl;    // 222

/*  // 结果同上,即直接初始化和采用赋值方式调用构造相同,且都不初始化成员变量

    y *py;
    py = new y();
    cout << py->GetA() << endl;    
    y *py2;
    py2 = new y;
    cout << py2->GetA() << endl;
    y *py3;
    py3 = new y(222);
    cout << py3->GetA() << endl;

*/

  system("pasue");
    return 0;
}

 

转载于:https://www.cnblogs.com/Bejadin/p/3934472.html

<think>好的,用户问的是在C++中,被初始化对象是放在括号内还是括号外。首先,我需要回忆一下C++成员初始化的方法。可能有两种情况:构造函数初始化列表在构造函数体内赋值。 首先,构造函数初始化列表是在构造函数的参数列表后面用冒号引出,然后每个成员变量后面跟括号或花括号初始化。例如: ClassName::ClassName(int a, double b) : member1(a), member2(b) {} 这里,member1member2是在括号外的,通过冒号后的列表进行初始化。这种情况下,成员变量的初始化是在构造函数体执行之前完成的,属于直接初始化,效率可能更高,尤其是对于型的成员。 另一种情况是在构造函数体内使用赋值操作。例如: ClassName::ClassName(int a, double b) { member1 = a; member2 = b; } 这里,成员变量是在构造函数体内的括号外被赋值。过,严格来说,这初始化,而是赋值操作。对于非静态的常量成员或引用成员,必须在初始化列表中初始化,因为它们能被赋值。 还需要考虑C++11引入的内成员初始化,即在声明成员变量时直接给出默认值。例如: class MyClass { int x = 0; double y {3.14}; }; 这种情况下,初始化是在声明时用等号或花括号进行的,属于初始化。如果有构造函数在初始化列表中再次初始化这些成员,那么初始化的值会被覆盖。 用户可能混淆了初始化方式的语法,需要明确区分初始化列表构造函数体内的赋值。需要指出,初始化列表是推荐的初始化方式,尤其是对于复杂型,可以避免必要的默认构造后续赋值来的开销。 另外,用户可能没有明确说明是哪种初始化方式,所以需要覆盖所有情况。比如,对于聚合初始化,可以使用花括号列表: struct Point { int x; int y; }; Point p = {1, 2}; // 聚合初始化,放在花括号内 但这种情况属于聚合初始化的构造函数初始化列表的情况。 总结:在C++中,成员变量的初始化如果通过构造函数初始化列表进行,是在参数列表后的冒号后面,放在括号外;如果是初始化,则在声明时用等号或花括号;而构造函数体内的赋值属于赋值操作,初始化。需要根据具体情况来判断,但推荐使用初始化列表进行成员初始化。</think>在C++中,成员变量的初始化主要分为两种方式,具体语法如下: --- ### 1. **构造函数初始化列表(括号外)** 这是推荐的初始化方式,语法格式为: ```cpp ClassName::ClassName(参数列表) : 成员变量1(初始值), 成员变量2(初始值) { // 冒号后初始化列表(括号外) // 构造函数体 } ``` **特点**: - 初始化列表位于构造函数参数列表的**冒号后**,且每个成员的初始化表达式放在**括号外**。 - 直接调用成员的构造函数,效率更高。 - **必须**用于以下情况: - 初始化常量成员 (`const` 成员) - 初始化引用成员 (`&` 成员) - 初始化没有默认构造函数的型成员。 **示例**: ```cpp class MyClass { public: MyClass(int a, double b) : x(a), y(b) { // xy在括号初始化 // 构造函数体 } private: const int x; double y; }; ``` --- ### 2. **构造函数体内赋值(括号内)** 语法格式为: ```cpp ClassName::ClassName(参数列表) { // 初始化在构造函数体内(括号内) 成员变量1 = 初始值; 成员变量2 = 初始值; } ``` **特点**: - 严格来说,这是**赋值**而非初始化。 - 适用于简单型(如基本数据型),但对于复杂型(如对象)会先调用默认构造函数,再赋值,效率较低。 - **无法**用于初始化 `const` 成员或引用成员。 **示例**: ```cpp class MyClass { public: MyClass(int a, double b) { x = a; // 错误!x是const成员,能在构造函数体内赋值 y = b; // 允许(假设y是非const成员) } private: const int x; double y; }; ``` --- ### 3. **内成员初始化C++11起)** C++11允许在定义中直接初始化成员变量(声明时初始化): ```cpp class MyClass { private: int x = 0; // 初始化(等号) double y {3.14}; // 初始化(花括号) }; ``` 初始化值可被构造函数初始化列表覆盖。 --- ### **总结** | 场景 | 语法位置 | 是否推荐 | |--------------------|--------------------------|----------| | 构造函数初始化列表 | 冒号后,括号外 | ✔️ 推荐 | | 构造函数体内赋值 | 构造函数体内部,括号内 | ❌ 推荐 | | 初始化 | 成员声明时,直接赋值 | ✔️ 推荐 | **关键区别**: - 初始化列表(括号外)是真正的初始化,直接调用构造函数。 - 构造函数体内赋值(括号内)是先默认构造再赋值,可能产生额外开销。 建议始终优先使用**构造函数初始化列表**或**初始化**(C++11+)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值