-
2020-09-22 12:18:56
类的构造函数的作用是对其成员进行初始化。而在构造函数中可以使用初始值列表为新创建的对象的成员进行赋值。
1 初始值列表
在类的构造函数名之后紧跟着冒号,冒号后面是要初始化的成员名,之后是圆括号或者花括号括起来的初始值。这样的结构就是构造函数的初始值列表,如下所示。
class A { public: A() :a(1),b(2) {}; int a; int b; };
其中,自定义类A具有一个包含了初始值列表的构造函数,使用该构造函数创建对象时,该对象的成员变量a的值是1,b的值是2。
2 类内初始化
对于“1 初始值列表”中提到的自定义类A,如果其还存在多个构造函数,
A(int i) :a(1),b(2) {}; A(int i, int j) :a(1),b(2) {}; A(int i, int j, int z) :a(1),b(2) {};
多个构造函数都包含了相同的初始值列表,代码看上去有些冗长。此时可以使用类内初始化的方法对其进行简化。
类内初始化指的是在定义类的成员时对其赋初值,赋初值的方式有两种:使用等号赋值和使用大括号赋值。
class A { public: ..... int a = 1; int b{ 2 }; };
此时,对于之前提到的包含初始值列表的构造函数,就可以简写成如下格式
A(){}; A(int i) {}; A(int i, int j){}; A(int i, int j, int z) {};
之后无论使用哪一种构造方法来产生该类的对象,这个对象的a和b的值分别是1和2。需要注意的是,类内初始化是C++11的新属性。
更多相关内容 -
数组元素默认的初始值都是什么?
2019-01-04 20:26:26byte 型数组元素默认初始值是 0 。 short 型数组元素的默认初始值是 0 。 int 型数组元素的默认初始值是 0 。 long 型数组元素的默认初始值是 0L。 float 型数组元素的默认初始值是 0.0f。 double 型数组元素的...在java中,如果为数组分配了内存空间,那么系统会为数组元素指定默认值,该默认值与数组的数据类型有关。
byte 型数组元素默认初始值是 0 。
short 型数组元素的默认初始值是 0 。
int 型数组元素的默认初始值是 0 。
long 型数组元素的默认初始值是 0L。
float 型数组元素的默认初始值是 0.0f。
double 型数组元素的默认初始值是 0.0d。
char 型数组元素的默认初始值是 .\u.000。
boolean 型数组元素的默认初始值是 false。
引用类型 (类、接口)数组元素的默认初始值是 null,例如:String 类型数组的默认初始值是 null。
@Test public void test15(){ byte arrByte[] = new byte[1]; for (int i = 0; i < arrByte.length; i++) { System.out.println("arrByte ==> "+arrByte[i]); } short arrShort[] = new short[1]; for (int i = 0; i < arrShort.length; i++) { System.out.println("arrShort ==> "+arrShort[i]); } int arrInt[] = new int[1]; for (int i = 0; i < arrInt.length; i++) { System.out.println("arrInt ==> "+arrInt[i]); } long arrLong[] = new long[1]; for (int i = 0; i < arrLong.length; i++) { System.out.println("arrLong ==> "+arrLong[i]); } float arrFloat[] = new float[1]; for (int i = 0; i < arrFloat.length; i++) { System.out.println("arrFloat ==> "+arrFloat[i]); } double arrDouble[] = new double[1]; for (int i = 0; i < arrDouble.length; i++) { System.out.println("arrDouble ==> "+arrDouble[i]); } boolean arrBoolean[] = new boolean[1]; for (int i = 0; i < arrBoolean.length; i++) { System.out.println("arrBoolean ==> "+arrBoolean[i]); } char arrChar[] = new char[1]; for (int i = 0; i < arrChar.length; i++) { System.out.println("arrChar ==> "+arrChar[i]); } }
-
C++ 初始值及默认初始化
2020-11-11 15:55:29文章目录初始值默认初始化内置类型的默认初始化类类型的默认初始化 初始值 在这里,对象(object) 是指一块能存储数据并具有某种类型的内存空间,而不单单指在与类有关的场景下使用的“对象”这个词。 当对象在创建...初始值
在这里,对象(object) 是指一块能存储数据并具有某种类型的内存空间,而不单单指在与类有关的场景下使用的“对象”这个词。
当对象在创建时获得了一个特定的值,我们说这个对象被初始化(initialized)。
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值;而赋值的含义是把对象的当前值擦除,而以一个新值来替代。
默认初始化
如果定义变量时没有指定初值,则变量被默认初始化(default initialized),此时变量被赋予了“默认值”。系统如何初始化取决于变量的类型以及变量定义的位置。
内置类型的默认初始化
如果是内置类型的变量未被显式初始化,它的值由定义的位置决定。
-
定义于任何函数体之外的对象会被默认初始化,此时其初始值和变量的类型有关:
- 对于算数类型中的
char
类型,其被初始化为’ '(与编译器相关,有的也是初始化为 0,所以基本内置类型也叫做零初始化); - 对于算数类型中的其他类型,其被初始化为
0
;
#include <iostream> using namespace std; int i; double d; bool b; char c; int main() { cout << "i = " << i << endl; // 0 cout << "d = " << d << endl; // 0 cout << "b = " << b << endl; // 0 cout << "char" << c << "char" << endl; // char char return 0; }
- 对于算数类型中的
-
定义于函数体内的内置类型的对象如果没有初始化,那么该变量将不被初始化(uninitialized),一个未被初始化的内置类型的变量的值是未定义的(undefined)。
-
如果试图拷贝或以其他形式访问此类值将引发错误。
-
一种例外情况是局部静态变量:在程序执行路径第一次经过对象定义语句时初始化(即使不提供初始值也会被零初始化),并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。
int count_calls() { static int ctr; // 在函数体内,static变量不初始化也可以,默认初始化为 0 return ++ctr; } // 这段程序将输出从 1 到 10 的数字。 int main() { for(int i=0; i != 10; ++i) { cout << count_calls() << endl; } return 0; }
在控制流第一次经过
ctr
的定义之前,ctr
被创建并初始化为 0。每次执行将ctr
加 1 并返回新值,且每次执行count_calls()
函数时,变量ctr
的值都已经存在并且等于函数上一次退出时ctr
的值。也就是说,如果局部静态变量没有显式的初始值,它将执行值初始化,内置类型的局部静态变量初始化为 0。
-
未初始化的变量含有一个不确定的值,使用未初始化变量的值是一种错误的编程行为并且很难调试。尽管大多是编译器都能对一部分使用未初始化变量的行为提出警告,但严格来说,编译器并未被要求检查此类错误。
最后建议初始化每一个内置类型的变量,虽然并非必须这么做,但如果我们不能确保初始化后程序安全,那么这么做不失为一种简单可靠的方法。
类类型的默认初始化
每个类各自决定其默认初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己决定。如果类允许这种行为,它将决定对象的初始值到底是什么:
-
绝大多数类都支持无需显式初始化而定义对象,这样的类提供了一个合适的默认值,使用默认构造函数来初始化。例如,
string
类规定如果没有指定初值则生成一个空串:string empty; // empty 非显式地初始化为一个空串
-
但有一些类要求每个对象都显式初始化,此时如果创建了一个该类的对象而未对其做明确的初始化操作,将引发错误。
如果是自定义的(或自动生成的)不执行任何操作的默认构造函数,那么适用与内置数据类型相同的规则来初始化成员变量;且如果成员变量是类类型,则会调用相应的默认构造函数对其进行初始化。
#include <iostream> // 合成的默认构造函数 class Worker { public: int height; }; // 有用户定义的默认构造函数 class Person { public: int height; Person() {}; // 默认构造函数,不执行任何操作 }; Worker g_worker; Person g_person; int main() { //Worker localWorker;//error C4700: 使用了未初始化的局部变量“localWorker” Person localPerson; std::cout << g_worker.height << std::endl; //0 std::cout << g_person.height << std::endl; //0 std::cout << localPerson.height << std::endl; //随机值 return 0; }
-
-
TCP拥塞控制慢开始算法拥塞窗口的初始值
2021-01-04 23:37:25问题:拥塞控制慢开始算法拥塞窗口的初始值是多少? 根据RFC文档: IW, the initial value of cwnd, MUST be set using the following guidelines as an upper bound. If SMSS > 2190 bytes: IW = 2 * SMSS bytes ...问题:拥塞控制慢开始算法拥塞窗口的初始值是多少?
根据RFC文档:
IW, the initial value of cwnd, MUST be set using the following
guidelines as an upper bound.If SMSS > 2190 bytes:
IW = 2 * SMSS bytes and MUST NOT be more than 2 segments
If (SMSS > 1095 bytes) and (SMSS <= 2190 bytes):
IW = 3 * SMSS bytes and MUST NOT be more than 3 segments
if SMSS <= 1095 bytes:
IW = 4 * SMSS bytes and MUST NOT be more than 4 segments
cwnd拥塞窗口初始值一般为2-4个smss大小
mss–最大报文段
SMSS(Sender’s MSS),发送方最大报文段
SYN段中携带的MSS选项值实际上就是本端网络设备的MTU。
MTU是指数据链路层向网络层发数据的最大传输单元。
mtu取决于网卡路由器,Linux可用ifconfig命令查看 -
C/C++中局部/全局变量初始值或默认值问题
2020-11-09 22:06:38在C语言中的全局变量和静态变量都是会自动初始化为0,堆和栈中的局部变量不会初始化而拥有不可预测的值。 C++保证了所有对象与对象成员都会初始化,但其中基本数据类型的初始化还得依赖于构造函数。 下文来详细探讨C... -
HashMap初始值如何设置,直接影响HashMap 的扩容效率
2019-01-02 16:43:01首先,我们要知道,HashMap 在储存数据结构的时候, 扩...4) 、负载因子0.75(听说这个值是经过大量实践算出来了的,这个值设定最合理),初始值16 指的是数组的长度 16(1<<4 是2 的4次方 ,这样写计算... -
非常量引用的初始值必须是左值
2017-02-20 17:05:48上述代码错误“非常量引用的初始值必须是左值”因为 int 和double 类型不一致,首先会执行隐式类型转换,产生一个临时变量。const double tmp=(double)n这样传给函数的就是一个常量。用一个常量(右值)对非常量类型... -
HashMap为啥初始化大小是16
2020-07-21 14:59:40HashMap的默认初始化长度是多少? static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 在JDK1.8的 235 行有1<<4就是16,为啥用位运算呢?直接写16不好么?这里主要是位运算的性能好,... -
单片机的定时初始值的设定
2017-09-26 22:18:50C51 定时器 TL0= C51 定时器 TL0=(65536-50000)%256是怎么推导出来的?...机器周期=12/n(n指晶振频率),假设你要定时的时间为M 那么定时的初值为: M/机器周期=初值; TH0=(65536-初值)/256; -
为什么HashMap的初始容量是16
2019-02-18 16:40:43到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16? https://blog.csdn.net/qq_35583089/article/details/80048285 一 ,到底什么是hash呢? 作者:知乎用户 链接:... -
MySQL中 auto_increment如何修改初始值和步长【亲测】
2019-05-18 17:27:121、如何查看auto_increment的初始值和步长 打开黑窗口,登录管理员账号和密码后,执行以下命令: show variables like 'auto_inc%'; -- 查看当前数据库的自增长设置 执行结果如下: 即 auto_increment的... -
为什么HashMap集合的初始大小是16?
2018-12-17 16:40:17如果两个元素不相同,但是hash函数的值相同,这两个元素就是一个碰撞 因为把任意长度的字符串变成固定长度的字符串,所以存在一个hash对应多个字符串的情况,所以碰撞必然存在 为了减少hash值的碰撞,需要实现一个尽量... -
"非常量引用的初始值必须为左值
2017-06-07 11:52:55非常量引用的初始值必须为左值 -
启动调试, 类型初始值设置引发异常
2018-01-30 10:17:52运行后报错: "类型初始值设置引发异常" 感觉应该是新建项目Form1的问题, 因为该三层架构在另一个Winform程序中运行正常. 在另一个BS程序中也运行正常. 于是开始了修改, 具体过程如下(基本是自己的脑残... -
为什么全局变量无须初始化,局部变量必须初始化
2021-05-23 06:42:32满意答案ccc000267推荐于 ...不要把赋初值与初始化混淆了:初始化是由编译器做的,形成可执行文件后,那些变量的值就在软件文件中放着,执行程序时直接使用了;而赋初值是由C/C++代码实现的,程序开始执行后才给变... -
非常量引用的初始值必须为左值的问题
2015-10-06 20:02:52首先理解什么是 右值引用 ( 下面是百度百科给出的解释 ): 右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一,这点从该特性的提案在C++ - State of... -
kmeans,k值选择,初始点
2019-11-08 10:08:27打卡+坚持 今日语录:告别平庸,告别懒惰,告别拖延,告别借口 一、kmeans的原理: kmeans是常用的聚类方法,主要思想是给定k个值...kmeans的算法很简单,但是k的选值和初始类簇中心点的选值很重要。 二、k的选... -
关于resetFields重置表单至初始状态的问题
2019-01-31 16:41:38当初用这个方法是想移除校验,但没注意到他会将其置为初始值。 后来取消使用这个方法,然后改成下面这个专门移除校验的方法就可以解决问题了,如下 : 好了问题完美解决了,现在页面不再会闪现上一次出现... -
非常量引用的初始值必须为左值,常量引用的初始值可以为左值、右值
2014-01-07 15:15:23非常量引用的初始值必须为左值,常量引用的初始值可以为左值、右值 -
Java变量的初始化
2021-03-08 17:33:43Java变量默认值Java变量的初始化,如果不赋值,将会有个默认值,对于基本类型,比如int,long是0, boolean 是false等,引用类型如果不设置,将会是null.package variable.initialize;public class Test {int intAge;... -
为啥HashMap的默认容量是16?
2019-12-09 09:39:30根据作者的推断,这应该就是个经验值(Experience Value),既然一定要设置一个默认的2^n 作为初始值,那么就需要在效率和内存使用上做一个权衡。这个值既不能太小,也不能太大。 太小了就有可能频繁发生扩容,... -
python怎样创建具有一定长度和初始值的列表
2020-11-21 02:05:55展开全部python的数据是可以动态2113增长的,直接定义使用5261a=[]即可:比如:a=[0,1,2],这时a[0]=0, a[1]=1, a[[2]=2;如果4102数组想a想定义...如果想定义1000长度的a,初始值全为0,则 a = [0 for x in range(0,... -
变量的声明、变量的定义、变量的初始化
2019-03-10 14:07:49变量的定义:用于为变量分配存储空间,还可以为变量指定初始值。 变量的初始化:为变量指定初始值。 广义上来说,变量的声明有两种情况: 1.需要建立存储空间的声明。例如:int a,我们在声明的时候就建立的存储... -
C++ 枚举类型初始化方式及值
2019-03-07 14:06:10枚举类型 枚举类型(enumeration)是C++...是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。 创建枚举,需要使用关键字 enum。枚举类型的一般形式为: enum 枚举名{ 标识符[=整型常数], 标识符... -
C#数组初始化
2020-12-23 15:46:21C#的数组初始化是在声明数组时将初始值放在大括号({})之内。如果没有指定初始值,则数组成员将自动初始化为该数组类型的默认初始值。请阅读数组的属性。如果将数组声明为某类型的字段,则当实例化该类型时它将被设置... -
08_Numpy初始化生成相同元素值的ndarray数组
2020-02-04 16:00:5308_Numpy初始化生成相同元素值的ndarray...numpy.zeros(): 初始值为0 numpy.ones(): 初始值为1 numpy.full(): 任意值的初始化 如何生成与现有数组相同(指的是形状shape,类型dtype相同)的数组。 numpy.zeros_lik... -
C++基础 内置类型和类类型的默认初始化和值初始化
2016-09-15 22:33:06C++基础 内置类型和类类型的默认初始化和值初始化写在前面的话如果定义变量时候没有指定初值,则变量被默认初始化。 但是默认初始化还有另外一个含义,在定义内置类型时由于定义变量的位置不同,有可能会不发生初始... -
什么是实例化,实例化、声明、初始化的区别
2020-04-26 21:40:29实例化(instantiate)是指在面向对象的编程中,把用类创建对象的过程称为实例化。是将一个抽象的概念类,具体到该类实物的过程。实例化过程中一般由类名 对象名 = new 类名(参数1,参数2...参数n)构成。 简介 ... -
TCP三次握手机制中的seq和ack的值到底是什么?
2018-04-12 17:53:40seq是序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是等待接收的数据包的序列号。在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行...