| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1751 人关注过本帖
标题:类/结构体成员变量初始化用大括号还是小括号,二者有什么区别?
只看楼主 加入收藏
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:4 
类/结构体成员变量初始化用大括号还是小括号,二者有什么区别?
本人菜鸡,也是第一次来咱们论坛。现在边看别人代码,边学习c++,现在看到一些问题很疑惑,特来请教各位,在此非常感谢。
关于类成员变量或结构体成员变量的初始化问题,我看到别人代码如下。
第一部分是别人定义的结构体中的代码,第二部分是类构造函数的部分代码。我有两个疑问,第一,有些成员变量为什么不直接用等号赋值呢?而是只写一个初始值呢?比如第一部分加粗代码。第二,成员变量的初始化到底是用大括号还是小括号呢?第一部分结构体中基本用的大括号。而第二部分类构造函数的初始化列表中有的有大括号,有的用小括号,应该怎么区分呢?二者有什么区别吗?非常感谢。
第一部分:
程序代码:
 struct GlobalConfiguration {
        // The overall size of the volume (in mm). Will be allocated on the GPU and is thus limited by the amount of
        // storage you have available. Dimensions are (x, y, z).
        // 其实也是核函数的数目, 这里的make_int3是CUDA中的核函数的大小
        int3 volume_size { make_int3(512, 512, 512) };

        // The amount of mm one single voxel will represent in each dimension. Controls the resolution of the volume.
        float voxel_scale { 2.f };

        // Parameters for the Bilateral Filter, applied to incoming depth frames.
        // Directly passed to cv::cuda::bilateralFilter(...); for further information, have a look at the opencv docs.
        int bfilter_kernel_size { 5 };
        float bfilter_color_sigma { 1.f };
        float bfilter_spatial_sigma { 1.f };


第二部分:
程序代码:
Pipeline::Pipeline(const CameraParameters _camera_parameters,
                       const GlobalConfiguration _configuration) :
            //  生成参数对象                                                         
            camera_parameters(_camera_parameters), configuration(_configuration),
            // 设置volume
            volume(_configuration.volume_size, _configuration.voxel_scale),
            // 设置模型数据(自己-这是某一帧的数据)
            model_data(_configuration.num_levels, _camera_parameters),
            // 初始化数据: 清空位姿,轨迹等
            current_pose{}, poses{}, frame_id{0}, last_model_frame{}
{***************************************************************}

搜索更多相关主题的帖子: 初始化 成员 括号 变量 The 
2021-12-09 22:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
你举的例子中,基本可以()与{}互换。之所以说“基本”是因为你没有给出它们的定义,别人只能瞎猜。比如 int3 、make_int3 是什么?不同的定义可以做到只能用(),只能用{},既可以()也可以{}。

对于提问须要用点心,比如第一段代码,完全可以清晰明了地写成
struct foo {
    int a { 1 };
};
甚至
struct foo {
     int a { 1 };
     int b = { 2 };
     int c = 3;
};

第二段代码可以写成
struct foo
{
    foo() : a(), b{}, c(1), d(2)
    {
    }

    int a, b, c, d;
};


/////////////////// 这里是分割线 ///////////////////

如果喜欢寻根究底,那么可以思考一下,为什么C++从C继承了=...初始化,还需要添加(...)初始化;为什么有了(...)初始化,还再添加需要{...}初始化。
(为了节约你Google的时间,我直接说个粗浅答案:自定义类型可能需要多个初始化参数,所以需要(...);为了区分 列表初始化 和 直接初始化,所以需要 {...}。而{}可以消除函数声明和函数定义的歧义等,属于附带的益处,不属于设计目的,我就不说了)

如果你不喜欢C++,只是简单地使用它,那你记住几点就够了。何时可以用{},何时只能用{},在既可以用()又可能用{}时哪些情况其含义不一样。

如果你是一个语言学家,喜欢研究标准条款的话,我盗用一下别人的图:https://pic1.
2021-12-10 08:46
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
收藏
得分:0 
回复 2楼 rjsp
非常感谢版主的回复以及批评建议。因为我初学c++,积累还比较少,有些问题我自己能用代码验证的就验证了,还有一些不知道怎么验证,网上也搜不到想要的结果,我又急需用此语言出一些成果,所以就直接网上发帖了,请各位大佬海涵。
今天我根据版主的提示搜索了相关资料(之前都不知道搜索哪些关键词比较好),了解了一些关于圆括号和大括号的使用场景,看了一天的博客,但实话讲还是有点晕,其中对您说的两句话还不是很理解:
第一句“为了区分列表初始化和直接初始化,需要用大括号”。
首先,我对直接初始化就看的就很糊涂,网上有人说:能直接调用类的构造函数或拷贝构造函数就能完成初始化的就是直接初始化。但我发现也有其他初始化方法会调用构造函数或拷贝构造函数。
第二句,“自定义类型可能需要多个初始化参数,所以需要(...);”
完全体会不到这句话的含义,为什么多个初始化参数就需要(),我现在感觉用{}进行初始化更为方便和安全。
再次感谢。
2021-12-11 20:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:20 
比如一个二维坐标点需要两个参数,那 Point pt = ... 怎么写呢?
所以创造出 Point pt(x, y),这叫直接初始化。
既然自定义类型可以用()初始化,那内建类型也应该可以,所以 int a(0) 合法。

对于vector等容器,vector<int> arr( 2, 3 ) 是初始化为两个3。
那要初始化为 一个2一个3 怎么办?所以创造出 vector<int> arr { 2, 3 },这叫列表初始化。
而这一语法,明显是脱胎于C语言的聚合初始化 ={...}

总之,对于现在的C++,可以都用{}初始化,它的名字就叫“统一初始化”。
但要注意的是,在部分场合,它并不完全等同于()。例子在第二段说过了,不再重复。
2021-12-11 22:13
wolfcan
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2021-12-9
收藏
得分:0 
回复 4楼 rjsp
谢谢
2021-12-12 19:33
快速回复:类/结构体成员变量初始化用大括号还是小括号,二者有什么区别?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038598 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved