C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第6节:初始化

FPGA&ASIC笔面试题(四):编写Verilog代码描述跨时钟域信号传输,快时钟域到慢时钟域(补充)       跨时钟域处理从快时钟域到慢时钟域,如果是下面第一个图,cklb则可以采样到signal_a_in,但是如果只有单脉冲,如第二个图,则不能确保采样掉signal_a_in。这个时候用两级触发器同步是没有用的。 代码如下: //Synchronous module Sync_Pulse( input clka, input clkb, input rst_n, input pulse_ina, output pulse_outb, ou 阅读详情

12.6 初始化

1.         当类的对象(或对象数组,可能是 cv 修饰的)声明时没有指定初始化器,或是初始化器是 () 的形式,该对象以 8.5 规定的方式初始化。没指定初始化器的时候执行默认初始化,初始化器是()的时候执行值初始化 。

2.         类的对象(或对象数组)可以被显式初始化,参见 12.6.1 和 12.6.2 。

3.         当对象数组被初始化(显式或隐式)时,按照下标的顺序调用数组每个元素的构造函数。【注:析构函数的顺序相反。】

12.6.1 显式初始化

1.         类的对象可以用括号括起来的表达式列表来初始化,这个表达式列表被解释为初始化该对象时调用的构造函数的参数列表。还可以使用一个赋值表达式作为 = 形式的初始化器。直接初始化或拷贝初始化的语义在这里仍适用;参见 8.5 。【例:

class complex {

// ...

public:

complex();

complex(double);

complex(double,double);

// ...

};

complex sqrt(complex,complex);

complex a(1); // 调用 complex(double) 来初始化

complex b = a; // 将 a 拷贝给 b ,调用隐式定义的拷贝构造函数

complex c = complex(1,2); // 用 complex(double,double) 创建一个临时对象,将其直接拷贝给 c 。 【按:这里没有调用隐式定义的拷贝构造函数,是为了提高效率的原因:在&c 处进行了直接初始化(C++ 标准允许编译器这么做);但语义上仍然要调用拷贝构造函数,所以该隐式定义的拷贝构造函数必须有可访问权限。】

complex d = sqrt(b,c); // 调用 sqrt(complex,complex) 生成临时对象,将其拷贝给 d

complex e; // 调用 complex() 初始化

complex f = 3; // 调用 complex(double) 创建一个 complex(3) 临时对象,将其拷贝给 f

complex g = { 1, 2 }; // 错误,需要相应的构造函数

】【注意:重载赋值操作符对初始化没影响。】

2.         当一个包含类对象的聚集(类或者数组)使用 { 初始化器列表 } 的形式初始化的时候,每个成员都执行对应的拷贝初始化。如果初始化列表中的初始化器比聚集的成员个数少,每个没有被显式初始化的成员必须被值初始化。【注: 8.5.1 描述了初始化列表中的赋值表达式是如何与被初始化的成员配对的。】【例如:

complex v[6] = { 1,complex(1,2),complex(),2 }; 

这里, v[0] 和 v[3] 调用 complex::complex(double) 来初始化, v[1] 调用 complex::complex(double,double) 来初始化, v[2] 、 v[4] 和 v[5] 调用 complex::complex() 来初始化。

另一个例子:

class X {

public:

int i;

float f;

complex c;

} x = { 99, 88.8, 77.7 };

       这里, x.i 初始化为 99 , x.f 初始化为 88.8 , x.c 调用 complex::complex(double) 拷贝初始化。【注:初始化聚集对象时,初始化器列表中的花括号可以省略,甚至在聚集有 class 类型的成员且自定义了类型转换函数的情况下也可以省略。】

3.         【注:如果类 T 没有默认构造函数,声明 T 类型的对象时不带初始化器是非法的。】

4.         【注:静态对象的初始化顺序在 3.6.2 和 6.7 中有描述。】

12.6.2 初始化基类和成员

1.         在类的构造函数定义语句中,直接基类子对象、虚基类子对象 及非静态数据成员的初始化器可以通过一个构造初始化器来指定,形式如下:

ctor-initializer:

: mem-initializer-list

mem-initializer-list:

mem-initializer

mem-initializer , mem-initializer-list

mem-initializer:

mem-initializer-id ( expression-list (可选) )

mem-initializer-id:

:: (可选) nested-name-specifier (可选) class-name

identifier

2.         mem-initializer-id 中的名字在构造函数所在类域中查找,如果没找到,就在包含构造函数的定义的域中查找。【注:如果该类包含一个与直接基类或虚基类名字相同的成员,用来命名成员或基类的 mem-initializer-id 指的是成员的名字;被隐藏的基类名字应该用带限定符的名字。】 mem-initializer-id 只能命名该类的非静态数据成员、直接基类或虚基类,其他情况都是非法的。可以使用 mem-initializer-list 来初始化基类,可以用任何指代该基类的名字。【例:

struct A { A(); };

typedef A global_A;

struct B { };

struct C: public A, public B { C(); };

C::C(): global_A() { } // mem-initializer 初始化基类 A

】

如果 mem-initializer-id 既可以指代直接非虚基类,也可以指代它的虚基类,从而造成二义性,那么 mem-initializer 就是非法的。【例如:

  struct A {A();}

  struct B: public virtual A{}

  struct C: public A, public B {C();}

     C::C() : A() {} // 非法,到底是哪个 A?

】

如果匿名 union 是类的一个成员,该类的构造初始化器可以用来初始化这个匿名 union 的成员。如果构造初始化器中为同一个成员(或同一个直接基类,或同一个虚基类)指定了多个 mem-initializer ,构造初始化器就是非法的。

 

3.         mem-initializer 中的 expression-list 根据 mem-initializer-id 来初始化基类或非静态数据成员子对象, mem-initializer 的语义如下:

a)         如果 mem-initializer 的 expression-list 省略,基类或成员子对象被值初始化;

b)        否则, mem-initializer-id 指示的子对象被用 expression-list 作为初始化器直接初始化。

【例:

struct B1 { B1(int); /* ... */ };

struct B2 { B2(int); /* ... */ };

struct D : B1, B2 {

D(int);

B1 b;

const int c;

};

D::D(int a) : B2(a+1), B1(a+2), c(a+3), b(a+4)

{ /* ... */ }

D d(10);

】

在每个基类和成员初始化之后都有一个序列点 。 mem-initializer 的 expression-list 的计算被看做是对应的基类或成员初始化过程的一部分。

4.         如果给定的非静态数据成员或基类不是用 mem-initializer-id 命名的(包括由于构造函数没有构造初始化器而没有 mem-initializer-id 的情况),那么:

a)         如果实体是非静态数据成员或基类,并且实体的类是个非平凡类,该实体被默认初始化;如果实体是 const 类的非静态数据成员,实体类必须有一个用户自定义的构造函数。

b)        否则,实体不会被初始化。如果实体是 const 或引用类型,或包含 const 类型成员的平凡类,程序就是非法的。

类 X 的构造函数调用结束之后,如果 X 有个成员没在 mem-initializer 中指定,也没有默认初始化,也没有值初始化,在构造函数体执行过程中也没有赋值,它的值是不确定的。

5.         初始化必须按照如下顺序执行:

a)         首先,只对最终继承类的构造函数来说,各虚基类必须按照它们在继承关系形成的有向无环图中出现的顺序:深度优先,从左到右遍历,来进行初始化。“从左到右”指的是在继承列表中出现的顺序;

b)        其次,直接继承类必须按照它们在继承列表中出现的顺序来初始化;(不管成员初始化列表中的顺序)

c)        再次,非静态数据成员必须按照它们声明时的顺序来初始化;(也不管成员初始化列表中的顺序)

d)        最后,执行构造函数体

【注:声明顺序被授权保证基类和成员子对象按照初始化相反的顺序销毁。】

6.         所有虚基类子对象都被最终继承类的构造函数初始化。如果最终继承类的构造函数没有在成员初始化列表中指定虚基类 V ,那么 V 的默认构造函数会被调用来完成其初始化。如果 V 没有可访问的默认构造函数,初始化语法是非法的。命名虚基类的成员初始化器在执行除最终继承类之外的任何类的构造函数的时候都会被忽略掉。【例:

class V {

        public:

                V();

                V(int);

                // ...

};

class A : public virtual V {

        public:

                A();

                A(int);

                // ...

};

class B : public virtual V {

        public:

                B();

                B(int);

                // ...

};

class C : public A, public B, private virtual V {

         public:

                C();

                C(int);

                // ...

};

A::A(int i) : V(i) { /* ... */ }

B::B(int i) { /* ... */ }

C::C(int i) { /* ... */ }

V v(1); // use V(int)

A a(2); // use V(int)

B b(3); // use V()

C c(4); // use V()

7.         成员初始化器的表达式列表中的名字在指定初始化器的构造函数域中进行计算。【例:

class X {

int a;

int b;

int i;

int j;

public:

const int& r;

X(int i): r(a), b(i), i(i), j(this->i) {}

};

将 X::r 初始化为 X::a ,将 X::b 初始化为构造函数的参数 i , X::i 初始化为构造函数的参数 i , X::j 初始化为 X::i ,每次创建 X 的对象时都会发生上述行为。】

【注:由于成员初始化器的表达式列表中的名字在指定初始化器的构造函数域中进行计算, this 指针可以用来指示正被初始化的对象。】

8.         成员函数(包括虚函数)在函数构造的过程中可以调用。同样,构造中的对象可以作为 typeid 或 dynamic_cast 的操作数。然而,如果在所有基类成员初始化器完成之前就在构造初始化器中(或者被该构造初始化器调用的函数中)执行这些操作,结果是未定义的。【例:

class A {

public:

A(int);

};

class B : public A {

int j;

public:

int f();

B() : A(f()), // 未定义 : 调用成员函数 f ,但此时基类子对象 A 还没初始化

j(f()) { } // 没问题 : 此时所有基类都已初始化

};

class C {

public:

C(int);

};

class D : public B, C {

int i;

public:

D() : C(f()),// 未定义 : 调用成员函数 f ,但此时基类子对象 C 还没初始化(虽然 B 已初始化)

i(f()) {} // 没问题 : 此时所有基类都已初始化

};

】

9.         【注: 12.7 描述了在没问题的情况下对象构造过程中调用虚函数、 typeid 、 dynamic_cast 的结果;即描述了构造过程中的多态行为。】

 

【软考】高项论文写作常见模板 本文主要介绍了YYYY年MM月DD日,我所在公司承接了XXXX项目的建设过程,包括了XXX,XXX,XXX内容,涉及到XXX,XXX,XXX技术。本人在项目中承载着项目经理的角色,主要负责了XXX,XXX,XXX方面事宜。此项目时间紧,任务重,实施过程中,我们特别注重了1、XXX 2、XXX 3、XXX几个方面,经过团队的一致努力,本项目按时交付,运行至今,客户反馈良好。但是在实施过程中,也曝露除了一些问题,包括了XXX,XXX等,通过应急处理和协调,这些问题都得到了妥善解决,没有影响到项目进度。 阅读详情

相关推荐

数据结构之栈(Stack)的实现详解

堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。

swadian2008的博客 3813

C/C++编程:继承构造函数

引入 在传统C++中,如果派生类要使用使用基类的构造函数,通常需要在构造函数中显式声明: struct A{ public: A(int i) {} }; struct B : A{ B (int i) : A(i){} }; B派生自A,B又在构造函数中调用A的构造函数,从而完成构造函数的传递。但是如果基类中有大量的构造函数时,可能需要这样写: struct A{ A(int i){}; A(double d, int i){} A(float f, int i, con

OceanStar的博客 3540

上汽CPMP开发流程与A、B、C、D样

也叫验收样件或设计样件,是根据A样试制结果优化后的样件,外观、功能达到设计要求,B样可以是手工样件或者模具件,B样件的全维度产品功能和尺寸参数已经固化下来,并需要和最终的量产产品保持一致。为批量样件或生产样件、展示样件,是在A/B的基础上完善结果,此时的产品状态已经完全定型,并能够满足客户和市场提出的各类需求。预试生产(Pre-Production)----------------------------------------------------------------------→D样。

weixin_43602865的博客 3717

struct和class区别、三种继承及虚继承、友元类

之前只知道在C++中类和结构体的区别只有默认的防控属性(访问控制)不同,struct是public的,而class是private的。但经过上网查资料才发现,除了这个不同之外,还有很多的知识点需要掌握。下面就听我一一道来~ 1、首先比较一下C中的结构体和C++中的结构体区别 C++中的struct是对C中的struct进行了扩充,所以增加了很多功能,主要的区别如下图所示: 上面罗列了在声明时的区别,在使用的过程中也有区别: 在C中使用结构体时需要加上struct,或者对结构体使用typedef..

weixin_39187443的博客 2072

kettle连接达梦资源库数据库插件

kettle自定义插件plugin database plugin 达梦插件 dm插件

weixin_42122126的博客 2170

时序数据库避坑指南:TDengine与IoTDB在车联网场景的7个关键对比

本文对比了时序数据库TDengine与IoTDB在车联网场景下的7个关键差异,包括数据模型设计、边缘-云端协同能力、车规级函数库、存储压缩算法等。通过真实案例和性能测试,帮助企业在新能源汽车大数据处理中选择合适的时序数据库,优化存储成本和实时告警性能。

rust6ferris的博客 453

C语言笔记——结构体struct

1、struct在使用的时候前面加.,表示不用考虑赋值顺序的赋值。 比如: struct led_operations { int num; int (*init) (int which); /* 初始化LED, which-哪个LED */ int (*ctl) (int which, char status); /* 控制LED, which-哪个LED, status:1-亮,0-灭 */ }; 我可以直接这样写,任意赋值: static struct led_ope

小吕的博客 728

高云FPGA系列教程(7):ARM GPIO外部中断

高云GN1NSR-4C共有16个GPIO,每个GPIO可配置成输入或输出模式,支持中断输入,触发方式可选择:上升沿、下降沿、高电平、低电平触发。中断优先级可通过NVIC进行设置,支持 0-7 级可编程中断优先级。

whik1194的博客 1375

c++中,class C:public A,B和class C:public A,public B有什么区别

题目 c++中,class C:public A,B和class C:public A,public B有什么区别? zxzx01352014-10-07 优质解答 默认的话应该是私有成员,所以B没有public的话恐怕就是private了吧

autumn20080101的专栏 1万+

基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)(235)

基于STM32设计的老人摔倒检测报警系统,不仅能够实时监测老人的位置信息,方便在紧急情况下快速定位,还能通过陀螺仪模块精确检测老人的身体姿态,一旦判断为摔倒状态,系统将立即触发蜂鸣器报警,并通过4G网络向指定联系人发送短信警示,确保老人能够迅速得到援助。此外,系统还支持老人主动按下设备上的按键发送求助短信,增强了系统的灵活性和实用性。

4691

Claude Code、Codex、Gemini CLI、OpenCode 和 OpenClaw 配置管理太麻烦?试试这个统一管理工具

还在为 Claude Code、Codex、Gemini CLI 等 AI CLI 配置烦恼?🤯 这款桌面工具支持五大助手统一管理,一键切换 50+ 服务商,MCP 和 Skills 集中管理 🛠️,跨平台支持,让你的 AI 编程更高效 ⚡

XiaoqiangClub的博客 913

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第1节:构造函数

12. 特殊成员函数【按:以下简称特殊函数或这些函数;如没有特别说明,对象是指类实例化的对象, 最外层的对象是指最继承子对象】特殊成员函数包括默认构造函数、拷贝构造函数、拷贝赋值操作符和析构函数。除了12.1中的情况,当程序不显式地声明这些函数时,编译器会隐式声明它们;如果使用了它们,编译器还会隐式地定义这些函数,如12.1,12.4和12.8所示。

declspec的专栏 756

Docker 实战:使用 Docker Desktop 在 MacOS 上安装 Docker

在这采用 Docker Desktop 在 Mac 上来安装 Docker。Docker Desktop 是 Docker 的管理桌面 IDE,提供了一个直观的GUI(图形用户界面),允许您直接在本机上管理容器、应用程序以及镜像。适用于 Mac、Linux 以及 Windows 环境,允许您构建、共享和运行容器化应用程序和微服务。Docker Desktop 可以大大降低在复杂配置上的时间,因此您可以专注于编写代码。它负责端口映射、文件系统问题和其他默认设置,并定期更新 Bug 修复和安全更新。

SmartSi 8008

C++标准ISO-IEC-14882-2003:第9章:类-第3节:成员函数

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty

declspec的专栏 733

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++标准ISO-IEC-14882-2003:第9章:类-第2节:类的成员

 9.2 类的成员类描述:成员声明 类描述opt访问描述符 : 类描述opt成员声明:声明描述符序列opt 成员声明器列表opt ;函数定义 ;opt::opt嵌套名字声明

declspec的专栏 762

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第7节:构造与析构

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty

declspec的专栏 689

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第2节:临时对象

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Styl

declspec的专栏 566

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第8节:拷贝对象

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

declspec的专栏 798

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第3节:类型转换

12.3 类型转换1.        对象的类型转换可以用构造函数和转换函数来指定。这些转换称为用户自定义的转换,用作隐式类型转换、初始化和显式类型转换。2.        只有在无二义性的情况下,用户自定义的转换才有效。转换遵循权限控制规则。权限检查在二义性解析之后发生。3.        【13.3讨论了函数中

declspec的专栏 527

C,C++ 的发展和标准化进程

C语言 https://baike.baidu.com/item/c语言 1.K&R C 起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。这本书被

icycolawater的专栏 1037

::* (The pointers to class members)

class A{public: int i; void f(){}};int main(void){ int A::*pvar = &A::i;    // (a) void (A::*pfunc)() = &A::f;    // (b) system("pause"); return 0;} 在ISO-IEC 14882 (2003)标准上,关于pointers to members的

Mind Mining ™ 2190

c++11介绍

C++11标准是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的简称[1]  。 C++11标准由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布[2]  ,并于2011年9月出版。201...

weixin_34187862的博客 164

一起来看看,C++11标准,那些超实用的新特性有哪些?

C++11标准是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的简称,也称为C++0x。它由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布,并于2011年9月正式出版。 C++11标准对C++98标准做了重大的修正和改进,C++11标准引入了许多新特性。

天恩软件工作室 974

for初始语句中声明变量的作用域问题

[论坛链接]在for的初始语句中声明的变量,按C++98标准的规定,有效期仅为for循环中,详见ISO-IEC14882:6.5.3 The for statement [stmt.for]3 If the for-init-statement is a declaration, the scope of the name(s) declared extends to the end

风焱 4753

4.1 左值到右值的转换 中英文对照(C++标准中文版 ISO/IEC 14882:2014)

4.1 左值到右值的转换 中英文对照(C++标准中文版 ISO/IEC 14882:2014)

疾风齿轮的专栏 1537

C++历史背景

C ++编程语言的历史可以追溯到1979年,当时Bjarne Stroustrup为博士学位论文进行了一些开发。在Stroustrup可以使用的所有单词中,有一种被称为Simula的语言,顾名思义,它可能是一种主要为仿真而设计的语言。Simula 67语言是Stroustrup使用的变体,被认为是支持面向对象编程范例的主要语言。Stroustrup发现这种范例对包装开发很有帮助。但是,Simula语言对于实践和实际使用而言太慢了;

爱编程的鱼的博客 1125
上一篇: C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第5节:自由存储管理
下一篇: C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第7节:构造与析构
declspec
博客等级 码龄21年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值