版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tkokof1/article/details/82660834
上述是通过初始化列表给基类带参构造传递参数,如果不通过初始化列表传递,会发生什么影响?
C++11引入了一系列改进,极大地增强了语言的表达力和效率,其中初始化列表(Initializer Lists)是一个尤为重要的新特性。它提供了一种更为直观和高效的构造复杂对象的方式,尤其是在处理容器、数组和其他聚合类型时。本文将深入浅出地探讨初始化列表的使用、常见问题、易错点以及如何避免这些陷阱,并通过代码示例加以说明。
构造函数是C++类用来初始化属性成员的方式。一个类的构造函数名和类名一致,构造函数没有返回值,也不能使用void来修饰。
常量成员,指的是在C++类中声明对象成员时可以加上const关键字,这样声明的成员叫常量成员, 常量成员分为常量数据成员和常量函数成员
C++中,输入是通过标准输入流(stdin)进行的,通常使用cin对象来实现。cin对象是istream类的实例,它提供了许多输入方法来读取不同类型的数据。
在C++中,类的正确初始化是确保程序正常运行的关键步骤之一。尤其是在使用初始化列表时,我们需要注意一些潜在的陷阱,以避免在代码执行过程中产生意外的结果。
一、什么是初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段 二、构造函数执行分为初始化和构造两个阶段,且初始化化阶段优先于计算阶段 三、一个好的原则是,能使用初始化列表的时候尽量使用初始化列表 因为初始化列表有时能少调用一次默认构造函数 四、必须要用初始化列表的时候 1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化
虽然上面构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,这和我们之间常常说的给缺省值其实就是赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
那么以上这四种情况是必须要用初始化列表的方式去初始化的,如果在函数体中去初始化会报错。
1.每个成员变量只能在初始化列表出现一次(初始化只能初始化一次) 2.类中包含 引用成员变量 const成员变量 自定义类型成员(没有默认构造函数) ,必须放在初始化列表位置进行初始化,(剩下的成员在初始化列表写不写都行,但是上述这三类就必须在列表写)
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
C++98的老码农们,应该都知道std::max() 函数可以从两个数中求最大值。
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
vector 容器是 C++ 标准模板库 ( Standard Template Library , STL ) 中的一个动态数组 容器 , 该容器有如下初始化方式 :
构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用初始化列表。
在调用构造函数的时候,就不是初始化成员变量了,而是给成员变量赋值。 C++中成员变量的初始化是在这里。
分享一个之前学的知识点,感觉还挺重要的,就是当一个类中的某个数据成员同时拥有就地初始化、构造函数初始化列表和构造函数函数体里的赋值,那么它会先执行哪个?最后生效的又是哪个呢? 根据老师的讲解,数据成员的初始化次序依次为: 就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效,但是就地初始化和构造函数初始化列表的执行情况是怎样呢?写段代码测试一下
可以看出,如果是根据初始化列表的顺序进行初始化,那么输出的值应该是666,666,10
在一个类中 , 其成员变量是 带有参构造函数 的类型 , 这种情况下没有调用 有参构造函数的机会 , 此时就会出现 编译报错情况 ;
std::set 集合容器 提供了 begin、end、rbegin 和 rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的 迭代器 , 函数原型如下 :
初始化列表作为C++11引入的特性,不仅用于初始化变量,还可以用于初始化结构体,如
list 双向链表容器 的 元素的指针 : 容器 中的元素 , 包含 2 个指针 , 一个指向该元素的前驱 , 一个指向该元素的后继 ;
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
下面的 std::list#insert 函数原型的作用是 在 指定的 迭代器位置 position 上 , 插入 1 个 value 值元素 ;
文章主要讲述了在C++中,拷贝构造函数和赋值运算符的调用顺序,以及临时对象和右值引用的使用情况。具体来说,拷贝构造函数和赋值运算符的调用顺序是:首先调用拷贝构造函数,然后调用赋值运算符。如果一个对象被声明为右值引用,则其拷贝构造函数和赋值运算符会被调用两次。同时,如果一个对象被声明为右值引用,则其拷贝构造函数和赋值运算符会被调用两次。
在C++11中,结构体或类的数据成员在申明时可以直接赋予一个默认值,初始化的方式有两种,一是使用等号“=”,二是使用大括号列表初始化的方式。注意,使用参考如下代码:
在 C++ 语言的 STL 标准模板库 中 , set 集合容器 是一个有序的集合 , 存储的元素值都是唯一的 , 不重复的 ;
1. Understand template type deduction. 函数模板的原型 template<typename T> void f(ParamType param); ParamType是一个左值引用或者指针时 template<typename T> void f(T& param); int x = 27; const int cx = x; const int& rx = x; f(x);// T是int,param类型是int& f(cx);// T是const int, p
自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书写速度。
// 11. 由多个文件组成的程序需要一种方法连接名字的使用和声明,c++通过头文件实现
内嵌对象的初始化使用了 初始化列表 来完成——内嵌对象必须使用初始化列表来实现初始化。举个简单的例子——现在我们有一个圆的类Circle,以及一个点坐标的类 Point,定义如下:
初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦去,并用一个新值替代它。
那大家可能有疑问了? 之前函数体内赋值不是用的好好的嘛,来这个干嘛? 现在就来解释:
C++变量是一种在程序中存储数据的机制。变量是用于存储和操作数据的标识符。以下是C++变量的详细介绍:
在前面的博客中已经分享有关构造函数 【C++】构造函数和析构函数详解,这次又再一次提到构造函数,一起来看看。
如果 类 中定义了 被 const 修饰 的 成员变量 , 那么该成员变量 必须被初始化 , 否则会报错 ;
其实大家可能会问,诶前面不是讲了有构造函数这个东西吗?为什么又要搞一个初始化列表出来。
今天要说的是C++使用可变参数的方式,包括std::initializer_list<T>模板类、可变参数模板。
指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。 声明格式为:*类型标识符 函数名(参数表)
析构函数调用顺序 与 构造函数调用顺序相反 , 直接 将 构造函数 调用顺序 倒序排列即可 ;
1. 在成员函数里如果我们只对成员变量读访问,那么建议加上 cosnt指针。 2. 在成员函数里如果我们要对成员变量进行修改,不能加上 cosnt指针。(否者修改不了成员变量)
在下面的代码中 , B 类的 有参构造函数 , 传入了 3 个参数 , 这三个参数都不在函数体中使用 , 而是在 参数列表中使用 ,
这里有三个类,其中A,C类是B的父类,然后在Main函数中声明一个B类型的变量,然后程序的输出是这样的:
const在类中,可以修饰成员变量和成员函数,主要目的也是保护成员内部的一些属性不被轻易的修改。以保证数据的完整性。下面分别介绍const修饰成员变量和成员函数。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用法①:取地址运算符,当&放在一个变量名之前时,它是一个一元运算符,用于获取该变量的内存地址。int *ptr = &var; 中的&var就是取var变量的地址
为了解决菱形继承的二义性和数据冗余的问题,提出了虚继承 探讨一下虚继承是如何解决数据冗余和二义性的
当看到这一小节的时候,让我重新认识了一下C++了。很多人在说起C++的时候,都只会说C++是建立在C基础上的一个面向对象的语言,而老师会加上一句:C++是一个面向过程同时,也面向对象的语言,因为它包容C。
领取专属 10元无门槛券
手把手带您无忧上云