C++中的值初始化和默认初始化
1、值初始化
顾名思义,就是用数值初始化变量。如果没有给定一个初始值,就会根据变量或类对象的类型提供一个初始值。对于int类型其值初始化后的值为0。
2、默认初始化:如果定义变量时没有指定初值,则变量被默认初始化。其初始值和变量的类型以及变量定义的位置相关。默认初始化类对象和默认初始化内置类型变量有所不同。
对于默认初始化内置类型变量来说:
1)定义在函数体之外的变量是全局变量,一般存储在全局区,存储在全局区的变量一般会执行值初始化。此时,其初始值和变量的类型有关。对于int类型其初始值为0,对于char类型其默认初始值为' '。例子如下:
#include <iostream>
using namespace std;
int i;
double d;
char c;
int main()
{
cout << "i = " << i << endl;
cout << "d = " << d << endl;
cout << "char" << c << "char" << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
2)定义在函数体内部的是局部变量,其存储在栈区中,如果没有指定初值,那么该局部变量将不会被初始化,也就是说这个局部变量的值是未定义的,是个随机值。此时,如果不给这个局部变量赋值,那么就不能使用该局部变量,否则就会出错,注意这种情况是没有被初始化,既没有使用默认初始化也没有使用值初始化,没有初始化的值是不能使用的。例子如下:
#include <iostream>
using namespace std;
int main()
{
int i;
cout << "i = " << i << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
对于默认初始化类对象来说:不仅在创建类对象时,要使用默认构造函数,而且类成员要没有类内初始值,类才会执行默认初始化。
如果是自定义的默认构造函数,不进行任何操作或者是编译器合成的默认构造函数,其成员变量经过默认初始化之后的初始化值和局部变量的初始值是一样的,即是随机值,但是可以使用(类普通成员变量也存在栈区)。例子如下:
#include <iostream>
#include <string>
using namespace std;
class Init
{
public:
int getA()
{
return a;
}
double getD()
{
return d;
}
char getC()
{
return c;
}
string getStr()
{
return str;
}
private:
1、值初始化
顾名思义,就是用数值初始化变量。如果没有给定一个初始值,就会根据变量或类对象的类型提供一个初始值。对于int类型其值初始化后的值为0。
2、默认初始化:如果定义变量时没有指定初值,则变量被默认初始化。其初始值和变量的类型以及变量定义的位置相关。默认初始化类对象和默认初始化内置类型变量有所不同。
对于默认初始化内置类型变量来说:
1)定义在函数体之外的变量是全局变量,一般存储在全局区,存储在全局区的变量一般会执行值初始化。此时,其初始值和变量的类型有关。对于int类型其初始值为0,对于char类型其默认初始值为' '。例子如下:
#include <iostream>
using namespace std;
int i;
double d;
char c;
int main()
{
cout << "i = " << i << endl;
cout << "d = " << d << endl;
cout << "char" << c << "char" << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
2)定义在函数体内部的是局部变量,其存储在栈区中,如果没有指定初值,那么该局部变量将不会被初始化,也就是说这个局部变量的值是未定义的,是个随机值。此时,如果不给这个局部变量赋值,那么就不能使用该局部变量,否则就会出错,注意这种情况是没有被初始化,既没有使用默认初始化也没有使用值初始化,没有初始化的值是不能使用的。例子如下:
#include <iostream>
using namespace std;
int main()
{
int i;
cout << "i = " << i << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
对于默认初始化类对象来说:不仅在创建类对象时,要使用默认构造函数,而且类成员要没有类内初始值,类才会执行默认初始化。
如果是自定义的默认构造函数,不进行任何操作或者是编译器合成的默认构造函数,其成员变量经过默认初始化之后的初始化值和局部变量的初始值是一样的,即是随机值,但是可以使用(类普通成员变量也存在栈区)。例子如下:
#include <iostream>
#include <string>
using namespace std;
class Init
{
public:
int getA()
{
return a;
}
double getD()
{
return d;
}
char getC()
{
return c;
}
string getStr()
{
return str;
}
private:
int a;
char c;
double d;
string str;
};
int main()
{
Init init;
cout << "a = " << init.getA() << endl;
cout << "d = " << init.getD() << endl;
cout << "ccc" << init.getC() << "ccc" << endl;
cout << "str" << init.getStr() << "str" << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
对于string类型的成员变量是个空串,这可能和string类的内部实现有关。
3、默认初始化的出现场景。
1)当我们在块作用域内不使用任何初始值定义一个非静态变量或者数组时。数组和非静态变量它们的值都是随机值,但是数组可以使用,而非静态变量需要在赋值以后才能使用。例子如下;
#include <iostream>
using namespace std;
int main()
{
int a[5];
for (int i = 0; i < 5; i++)
{
cout << "数组元素值为:" << a[i] << endl;
}
1、值初始化
顾名思义,就是用数值初始化变量。如果没有给定一个初始值,就会根据变量或类对象的类型提供一个初始值。对于int类型其值初始化后的值为0。
2、默认初始化:如果定义变量时没有指定初值,则变量被默认初始化。其初始值和变量的类型以及变量定义的位置相关。默认初始化类对象和默认初始化内置类型变量有所不同。
对于默认初始化内置类型变量来说:
1)定义在函数体之外的变量是全局变量,一般存储在全局区,存储在全局区的变量一般会执行值初始化。此时,其初始值和变量的类型有关。对于int类型其初始值为0,对于char类型其默认初始值为' '。例子如下:
#include <iostream>
using namespace std;
int i;
double d;
char c;
int main()
{
cout << "i = " << i << endl;
cout << "d = " << d << endl;
cout << "char" << c << "char" << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
2)定义在函数体内部的是局部变量,其存储在栈区中,如果没有指定初值,那么该局部变量将不会被初始化,也就是说这个局部变量的值是未定义的,是个随机值。此时,如果不给这个局部变量赋值,那么就不能使用该局部变量,否则就会出错,注意这种情况是没有被初始化,既没有使用默认初始化也没有使用值初始化,没有初始化的值是不能使用的。例子如下:
#include <iostream>
using namespace std;
int main()
{
int i;
cout << "i = " << i << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
对于默认初始化类对象来说:不仅在创建类对象时,要使用默认构造函数,而且类成员要没有类内初始值,类才会执行默认初始化。
如果是自定义的默认构造函数,不进行任何操作或者是编译器合成的默认构造函数,其成员变量经过默认初始化之后的初始化值和局部变量的初始值是一样的,即是随机值,但是可以使用(类普通成员变量也存在栈区)。例子如下:
#include <iostream>
#include <string>
using namespace std;
class Init
{
public:
int getA()
{
return a;
}
double getD()
{
return d;
}
char getC()
{
return c;
}
string getStr()
{
return str;
}
private:
int a;
char c;
double d;
string str;
};
int main()
{
Init init;
cout << "a = " << init.getA() << endl;
cout << "d = " << init.getD() << endl;
cout << "ccc" << init.getC() << "ccc" << endl;
cout << "str" << init.getStr() << "str" << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
对于string类型的成员变量是个空串,这可能和string类的内部实现有关。
3、默认初始化的出现场景。
1)当我们在块作用域内不使用任何初始值定义一个非静态变量或者数组时。数组和非静态变量它们的值都是随机值,但是数组可以使用,而非静态变量需要在赋值以后才能使用。例子如下;
#include <iostream>
using namespace std;
int main()
{
int a[5];
for (int i = 0; i < 5; i++)
{
cout << "数组元素值为:" << a[i] << endl;
}
system("pause");
return 0;
}
在VS2015下编译结果如下:
2)当一个类本身含有类类型的成员且使用合成的默认构造函数时。使用合成的默认构造函数那么该类和其类类型成员都会执行默认初始化。
3)当类类型的成员没有在构造函数初始值列表中显示地初始化时。说明该类类型成员会调用默认构造函数。
4、值初始化的出现场景
1)在数组初始化的过程中如果我们提供的初始值数量少于数组的大小时,剩余的为提供初始值部分就会执行值初始化。
#include <iostream>
using namespace std;
int main()
{
int a[5] = {1, 2, 3};
for (int i = 0; i < 5; i++)
{
cout << "数组元素值为:" << a[i] << endl;
}
system("pause");
return 0;
}
在VS2015下编译结果如下:
由结果可知,没有提供初始值的数组元素按照值初始化为了0。
2)当我们不使用初始值定义一个局部静态变量时。因为是静态的,所以该局部静态变量不再存储在栈区,而是存储在全局区。此时,就会根据类型进行设置该变量的初始值,即值初始化。例子如下:
#include <iostream>
using namespace std;
int main()
{
static int a;
static char c;
cout << "a:" << a << endl;
cout << "ccc" << c << "ccc" << endl;
system("pause");
return 0;
}
VS2015编译结果为:
3)当我们通过书写形如T()的表达式显示请求值初始化时,其中T是类型名(vector的一个构造函数只接受一个实参用于说明vector的大小),它就是使用一个这种形式的实参来对它的元素初始器继续值初始化)。
===》》》对于默认初始化,可以参考《C++ primer》P40页
===》》》对于值初始化,可以参考《C++ primer》P88页
===》》》对于默认初始化和值初始化的发生场景,可以参考《C++ primer》P262页
===》》》对于合成的默认构造函数,可以参考《C++ primer》P235页
点赞 4
————————————————
版权声明:本文为CSDN博主「flychildc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/J_H_C/article/details/83589282
system("pause");
return 0;
}
在VS2015下编译结果如下:
2)当一个类本身含有类类型的成员且使用合成的默认构造函数时。使用合成的默认构造函数那么该类和其类类型成员都会执行默认初始化。
3)当类类型的成员没有在构造函数初始值列表中显示地初始化时。说明该类类型成员会调用默认构造函数。
4、值初始化的出现场景
1)在数组初始化的过程中如果我们提供的初始值数量少于数组的大小时,剩余的为提供初始值部分就会执行值初始化。
#include <iostream>
using namespace std;
int main()
{
int a[5] = {1, 2, 3};
for (int i = 0; i < 5; i++)
{
cout << "数组元素值为:" << a[i] << endl;
}
system("pause");
return 0;
}
在VS2015下编译结果如下:
由结果可知,没有提供初始值的数组元素按照值初始化为了0。
2)当我们不使用初始值定义一个局部静态变量时。因为是静态的,所以该局部静态变量不再存储在栈区,而是存储在全局区。此时,就会根据类型进行设置该变量的初始值,即值初始化。例子如下:
#include <iostream>
using namespace std;
int main()
{
static int a;
static char c;
cout << "a:" << a << endl;
cout << "ccc" << c << "ccc" << endl;
system("pause");
return 0;
}
VS2015编译结果为:
3)当我们通过书写形如T()的表达式显示请求值初始化时,其中T是类型名(vector的一个构造函数只接受一个实参用于说明vector的大小),它就是使用一个这种形式的实参来对它的元素初始器继续值初始化)。
===》》》对于默认初始化,可以参考《C++ primer》P40页
===》》》对于值初始化,可以参考《C++ primer》P88页
===》》》对于默认初始化和值初始化的发生场景,可以参考《C++ primer》P262页
===》》》对于合成的默认构造函数,可以参考《C++ primer》P235页
点赞 4
————————————————
版权声明:本文为CSDN博主「flychildc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/J_H_C/article/details/83589282
int a;
char c;
double d;
string str;
};
int main()
{
Init init;
cout << "a = " << init.getA() << endl;
cout << "d = " << init.getD() << endl;
cout << "ccc" << init.getC() << "ccc" << endl;
cout << "str" << init.getStr() << "str" << endl;
system("pause");
return 0;
}
在VS2015中编译结果如下:
对于string类型的成员变量是个空串,这可能和string类的内部实现有关。
3、默认初始化的出现场景。
1)当我们在块作用域内不使用任何初始值定义一个非静态变量或者数组时。数组和非静态变量它们的值都是随机值,但是数组可以使用,而非静态变量需要在赋值以后才能使用。例子如下;
#include <iostream>
using namespace std;
int main()
{
int a[5];
for (int i = 0; i < 5; i++)
{
cout << "数组元素值为:" << a[i] << endl;
}
system("pause");
return 0;
}
在VS2015下编译结果如下:
2)当一个类本身含有类类型的成员且使用合成的默认构造函数时。使用合成的默认构造函数那么该类和其类类型成员都会执行默认初始化。
3)当类类型的成员没有在构造函数初始值列表中显示地初始化时。说明该类类型成员会调用默认构造函数。
4、值初始化的出现场景
1)在数组初始化的过程中如果我们提供的初始值数量少于数组的大小时,剩余的为提供初始值部分就会执行值初始化。
#include <iostream>
using namespace std;
int main()
{
int a[5] = {1, 2, 3};
for (int i = 0; i < 5; i++)
{
cout << "数组元素值为:" << a[i] << endl;
}
system("pause");
return 0;
}
在VS2015下编译结果如下:
由结果可知,没有提供初始值的数组元素按照值初始化为了0。
2)当我们不使用初始值定义一个局部静态变量时。因为是静态的,所以该局部静态变量不再存储在栈区,而是存储在全局区。此时,就会根据类型进行设置该变量的初始值,即值初始化。例子如下:
#include <iostream>
using namespace std;
int main()
{
static int a;
static char c;
cout << "a:" << a << endl;
cout << "ccc" << c << "ccc" << endl;
system("pause");
return 0;
}
VS2015编译结果为:
3)当我们通过书写形如T()的表达式显示请求值初始化时,其中T是类型名(vector的一个构造函数只接受一个实参用于说明vector的大小),它就是使用一个这种形式的实参来对它的元素初始器继续值初始化)。
===》》》对于默认初始化,可以参考《C++ primer》P40页
===》》》对于值初始化,可以参考《C++ primer》P88页
===》》》对于默认初始化和值初始化的发生场景,可以参考《C++ primer》P262页
===》》》对于合成的默认构造函数,可以参考《C++ primer》P235页
点赞 4
————————————————
版权声明:本文为CSDN博主「flychildc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/J_H_C/article/details/83589282
C++中的值初始化和默认初始化相关推荐
- c#关于int(或其他类型)的字段在对象初始化时默认初始化问题的解决方法
c#关于int(或其他类型)的字段在对象初始化时默认初始化问题的解决方法 参考文章: (1)c#关于int(或其他类型)的字段在对象初始化时默认初始化问题的解决方法 (2)https://www.cn ...
- 值初始化和默认初始化的区别
参考资料[1]P185指出,如果局部变量没有显式的初始化值,它将执行值初始化(不是默认初始化!),内置类型的局部静态变量初始化为0 1 背景 参考资料[1]P39提到,在C++语言中,初始化与赋值并不 ...
- C++中的默认初始化
c++中涉及到内置类型.复合类型.STL对象.结构体.类等对象,初始化也有很多类型:默认初始化.拷贝初始化.直接初始化. 默认初始化是指未指定变量具体值时,变量自动被初始化.默认初始化存在很多差异,分 ...
- C语言 数组的初始化 数组不初始化会怎样 数组的默认初始值
本程序用于测试:数组的初始化. (1)定义数组后必须要初始化,不要认为不初始化,系统就会自动初始化为O;如果不初始化,局部变量在栈上,各数组元素的值将是随机数; (2)数组初始化:程序员至少必须把数组 ...
- java 数组定义、动态初始化、默认值
一.数组的定义与格式: 数组就是用来存储一批同种类型的内存区域. 1.格式:(定义数组直接给数组赋值) 数据类型[] 数组名 = new 数据类型[] {元素1,元素2,元素3,-}; 简化写法: 数 ...
- 初始化、赋值、默认初始化、列表初始化、类内初始值、直接初始化与拷贝初始化
文章目录 初始化和赋值的区别 什么是默认初始化? 列表初始化 列表初始化的使用场景 不适合使用列表初始化的场景 类内初始值 混用string对象和C风格字符串 数组与vector对象 关于vector ...
- caffe中权值初始化方法
参考:https://www.cnblogs.com/tianshifu/p/6165809.html 首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如 ...
- 数组的初始化与默认值
初始化 一维数组 数组一旦初始化完成,其长度就确定了 int[] ids;//声明//1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行ids = new int[]{1001,1002,1 ...
- java数组的默认初始化值
学习笔记 /*一维数组默认初始化值>整型数组:0>浮点型数组:0.0>char型:0或'\u0000'而非'0';相当于一个空格的效果.>Boolean型:false>引 ...
最新文章
- Java 8 一行代码解决了空指针问题,太厉害了...
- 二十六、二叉树--查找指定节点
- 学python的游戏app_Python教学软件
- 用MODELLER构建好模型后对loop区域进行自动的优化过程
- Spring boot的@PropertySource注解
- Serverless 与容器决战在即?有了弹性伸缩就不一样了
- 又错过了暴富的机会!亚马逊AWS突发Bug,比特币现史诗级捡漏机会?
- 企业为什么要上智能仓储系统?
- 推荐好用的Linux远程连接工具
- 360浏览器Linux版内核,360安全浏览器国产操作系统版下载,附特色功能介绍
- video 圆角 html,圆形视频和圆角视频的一种实现方式
- DeepinXP Lite 完美精简版 |5.2|5.3|5.4|5.5|5.6|5.7|5.8|5.9|5.10||6.1New| 迅雷下载
- kernelbase故障模块_错误模块名称: KERNELBASE.dll
- ADS129X芯片中文资料(二)——模拟功能部分介绍
- IE6,IE7和FireFox兼容处理(持续发现中)
- 洛谷 - P3374 树状数组1
- .c和.h文件的区别
- python风控建模项目_像潘叔叔那样用半年时间学Python,有哪些书值得看?
- 拒绝服务攻击漏洞-Hash
- 用手机搭建博客并部署到gitee
热门文章
- 4:如何实现对两个整数变量的值进行互换。
- PHP控制转盘抽奖代码,PHP 根据概率 实现抽奖转盘算法 代码
- 基于python爬虫技术的应用_基于Python爬虫技术的应用
- [译] APT分析报告:08.漏洞利用图谱–通过查找作者的指纹来寻找漏洞
- iOS之LLVM编译流程和Clang插件开发集成
- iOS之深入解析如何编写自己的CocoaPods插件
- Git之深入解析本地仓库的基本操作·仓库的获取更新和提交历史的查看撤销以及标签别名的使用
- OpenGL ES之着色语言GLSL的使用说明及API
- 2013\National _C_C++_A\4.约数倍数选卡片
- scp: /usr/java: Permission denied