c++变量初始化(猜想......)

未初始化局部变量问题与编译器优化 本文针对C/C++语言,不知道其他语言的是否会一样。 首先开一个超大(爆栈)数组,int[40000000000],代码如下: #include <iostream> using namespace std; int main() { // 下列取消注释,都是单个操作,控制变量 int a[4000000000]; // 只这样定义一个数组... 阅读详情

全局的、名字空间的、静态的对象会被自动初始化适当类型的0。

堆,容器中和类的显式空构造函数的对象会被调用其构造函数初始化,但并不会被初始化为相应的0,(没有数组)如

 

char ch[10];

for(int i = 0; i < 10; i++)

cout<<(int)ch[i]<<endl;//-52 -52 -52....int数组亦然

 

结构和类成员的初始化:

谈到结构和类成员,除非提供显示的构造函数进行初始化,否则可以分为以下两种(是否用默认构造函数初始化):

class A

{

//A(){}

public:

int i;

}

 

 

A a;

void f()

{

A a1;

cout<<a.i;//error,因为A并没有提供nontrivial default constructor,所有并没有初始化

cout<<a1.i;//0, 因为a是全局变量。

}

 

如果将//A(){}去掉,则cout<<a.i;会打印出一个未定义的i值,并不会报错。

 

总之,用户如果没有提供一个构造函数的话,但只是为类中的类成员和基类初始化!!!其他的一概不初始化!!!

 

 

 

附录:

nontrivial default constructor信息参见以下:

http://blog.youkuaiyun.com/dongfengsun/archive/2008/02/18/2104176.aspx

 

 

假期间闲来无事,就下载了某大师的VC++视频资料。在讲到C++时,说是如果程序员没有自己定义默认构造函数,

 

那么编译器会自动为我们产生一个默认的构造函数。 本来这个错误的认识很多程序员都有,不足为奇。但有这

 

么多年编程经验的高手也有这样的错误认识就不禁让我哑然了。

 

        其实编程语言和我们所用的任何软件没有区别,例如Photoshop、AutoCAD之类。其唯一不同的是我们用

 

的编程语言是基于编译器的,而应用软件是基于我们的编程语言的。

 

        既然我们所用的软件是基于编译器的,那么理解编译器在背后到底为我们做了些什么、在什么情况下做

 

了哪些事情就显得异常重要。这就像Photoshop会为你产生一些基本图形例如矩形、三角形之类,而不会凭空产

 

生一些风景优美的图片一样。

 

        在《C++ Annotated Reference Manual(ARM)[ELLIS90]》中的Section 12.1告诉我们:"Default 

 

constructors...在需要的时候被编译器产生出来"。

 

        其实默认构造函数也是分为两类的:有用的、无用的。

 

        所谓有用的标准也是就默认构造函数会为我们的类做一些初始化操作。那么无用的就不会做任何工作,

 

从而对我们的类也就没有任何意义。所以,我们通常所说的默认构造函数是指有用的默认构造函数,其英文名字

 

叫nontrivial default constructor。

 

        那么到底什么时候编译器会为我们产生nontrivial default constructor呢?有下面四中情况:

 

       ①如果一个类里面某个成员对象有nontrivial default constructor,编译器就会为我们的类产生

 

nontrivial default constructor。

 

       那么编译器这样做的理由是什么?

 

       答案是因为类成员对象有nontrivial default constructor,那么编译器就需要显式的来调用这个类成

 

员对象的nontrivial default constructor。而编译器想显式的调用类成员对象的nontrivial default 

 

constructor,就需要自己来合成一些代码来调用。但是记住,编译器合成的nontrivial default constructor仅

 

仅调用类成员对象的默认构造函数,而不对我们类里面的其它变量做任何初始化操作。

 

        也就是说,如果你想初始化类成员变量以外的变量例如一个int、一个String,那么必须自己定义默认构

 

造函数来完成这些变量的初始化。而编译器会对你定义的默认构造函数做相应的扩展,从而调用类成员对象的

 

nontrivial default constructor。

 

        ②如果一个派生类的基类有nontrivial default constructor,那么编译器会为派生类合成一个

 

nontrivial default constructor。

 

        编译器这样的理由是:因为派生类被合成时需要显式调用基类的默认构造函数。

 

        ③如何一个类里面隐式的含有任何virtual function table(或vtbl)、pointer member(或vptr)。

 

        编译器这样做的理由很简单:因为这些vtbl或vptr需要编译器隐式(implicit)的合成出来,那么编译器

 

就把合成动作放到了默认构造函数里面。所以编译器必须自己产生一个默认构造函数来完成这些操作。

 

        所以如果你的类里带有任何virtual function,那么编译器会为你合成一个默认构造函数。

 

        ④如果一个类虚继承于其它类。

 

        编译器这样做的理由和③类似:因为虚继承需要维护一个类似指针一样,可以动态的决定内存地址的东

 

西(不同编译器对虚继承的实现不仅相同)。

 

        那么除了以上四种情况,编译器并不会为我们的类产生默认构造函数。

 

        所以编程中切忌想当然,要明白哪些事情是编译器做的,哪些事情需要程序员来完成的。就像堆所占用

 

的资源需要程序员自己来释放,而栈空间是编译器管理的一样。

 

        只有如此,才能编写出质量更高的代码。

 

 

C++11中列表初始化机制详解 目录 概述 实现机制详解 POD类型的列表初始化 含有构造函数的类的列表初始化(C++11) 列表初始化用于函数返回值 引入std::initializer_list 代码验证 应用 总结 概述 定义:列表初始化是C++11引入的新标准,目的是统一初始化方式 C++11以前只能使用列表初始化来初始化内置类型数组和POD类型对象,C++11中列表初始化可以用于初始化任何类型对象 POD(plain old data)类型:仅由内置类型变量构成且不含指针的类,简单来 阅读详情

相关推荐

C++实现3n+1猜想:从基础模拟到记忆化搜索优化

在计算机科学中,算法模拟是理解程序逻辑与控制流的基础。通过模拟数学过程,可以深入掌握循环、条件判断等核心编程概念。其技术价值在于将抽象问题转化为可执行的代码逻辑,提升代码的健壮性与性能。在工程实践中,这类模拟问题常出现在算法竞赛与OJ系统中,用于训练程序员的边界处理与优化能力。以经典的3n+1猜想为例,它不仅是数学上的趣味问题,更是学习C++整数运算、溢出防范和性能优化的绝佳案例。通过基础循环实现后,进一步引入记忆化搜索技术,利用哈希表缓存中间结果,可大幅减少重复计算,体现了动态规划思想在解决重叠子问题中的

weixin_34060299的博客 600

PAT (Basic Level) Practice1005 继续(3n+1)猜想

1005 继续(3n+1)猜想 输入格式: 每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。 输出格式: 每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

PKM of bk 427

嵌入式人工智能(18-基于树莓派4B的继电器JQC-3FF-S-Z)

本次实验的输出端控制不会接强电,就用LED灯来模拟即可,由于我那个流水灯模块是低电平点亮,所以接线稍有不同,同学们注意。只有继电器吸合,输出端的NO与COM就导通,给LED低电平然后就亮,否则继电器断开,NO与COM不导通,LED不亮。原理都一样,控制电流的接通与断开,这个模块看起来还简单点,毕竟还有2个指示灯,下端IN如接上电源红灯亮,继电器动作有电流通过绿灯亮。在实际应用中,可以通过编程控制继电器的通断状态,例如在Python编程中设置继电器模块的通断时间,从而实现自动化控制。

u010152658的博客 2530

c++中初始化列表初始化顺序和变量的声明顺序一致(初始化列表的构造顺序)

有如下代码所示,很容易想到先用3初始化j,然后再用j初始化i,所以最后调用print成员函数输出的结果是i = 3,j = 3.但是通过运行得出的结果如下面所示,和猜想的不一样。这里分析具体原因。 初始化列表初始化的顺序和变量声明的顺序一致,和初始化中的顺序无关。这里的代码中i比j先声明,所以这里的初始化的顺序应该是先用j对i初始化,然后再用k对j初始化。由于在对i初始化的时候j并没有被初始化...

仗劍走天涯 1860

从零到一:手把手教你用C# WinForms搭建工控上位机(含Panel控件布局与事件处理详解)

本文详细介绍了如何使用C# WinForms框架从零开始搭建工控上位机系统,重点讲解了Panel控件的布局技巧和事件处理机制。通过实战案例,帮助开发者掌握界面分区规划、动态窗体切换及数据通信等核心功能,适用于工业自动化监控系统的开发。

weixin_30321709的博客 607

Infiniband互连网络概述

一、Infiniband是什么? InfiniBand(简称IB)是一种工业标准规范,它定义了一种输入/输出架构,用于计算节点、通信基础设施设备、存储和嵌入式系统的互连。操作系统可以是Linux、Windows或ESXI。 IB网络一共是五层,从第一天起,IB就被设计为提供一个端到端的解决方案,改善和加速从物理层到上层的所有协议层。 IB协议于2000年由IBTA(InfiniBand Trade Association)提出,其规定了一...

weixin_41687819的博客 5226

C++ 自学教程 LearnCPP 第1.3章 初窥变量,初始化,和赋值

C++ 自学教程 第1.3章 初窥变量,初始化,和赋值 前言: 从这一节开始,每一节教程的最后可能附上一个小测试。我不会用优快云的做那种点击再显示的功能,就选择把答案加个几行放在最后了。有什么不理解的也欢迎留言探讨。阅读愉快。 对象 C++程序创建,读取,改变,和销毁对象。对像(object)是一段被储存某数据的内存。你可以把对象想象为一个邮箱,或者一个小房间。你可以用它来存储和...

cloudy_toast的博客 527

modbus

从机地址 功能码 起始地址高位 起始地址低位 数量高位 数量低位 字节数 0001H高位 0001H低位 0002H高位 0002H低位 CRC高位 CRC低位。每个输入寄存器的长度为2个字节。其中,CDH对应线圈0013H到001AH的内容,01H对应线圈001B到001CH的内容,未使用位用0填充。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。

lunhuicnm的博客 9745

HDU1032 The 3n + 1 problem

大致题意:给了一段算法,求给定输入区间内算法运行最多的次数。 这题好奇怪,我之前后输出a,b和结果就是WA,但是把a和b放到前面然后又加了个return 0就奇迹般的AC了。还有在计算max的时候我把sum = 1的初始化放在了外面导致出错,都是小的错误却影响了整个程序。#include <iostream> #include <fstream>using namespace std;int ma

客户端和游戏技术 581

从光耦隔离到稳定驱动:信捷伺服与STM32的硬件设计陷阱与救赎

本文深入探讨了信捷伺服驱动器与STM32微控制器配合时的硬件设计关键问题,包括光耦隔离电路选型、电源电压选择、拨码开关设置等核心环节。针对伺服驱动器的稳定驱动需求,提供了从电路设计到抗干扰策略的完整解决方案,帮助工程师规避常见陷阱,提升工业控制系统的可靠性。

gold8的专栏 310

保姆级教程:用MATLAB搞定运动模糊图片修复(附完整代码与避坑指南)

本文提供了一份详细的MATLAB运动模糊图片修复教程,涵盖盲复原、图像复原等核心技术。通过傅里叶变换和Radon变换分析模糊参数,对比逆滤波、维纳滤波和Lucy-Richardson算法效果,并附完整代码与避坑指南,帮助用户实现专业级图像处理。

weixin_26765363的博客 228

C++11初始化列表与参数列表的作用

最近遇到了一个程序,一开始有些莫名其妙,最后经过思考、猜想、验证的过程,将其总结如下: 首先先上代码: 函数声明如下: class Controller { using AnalysisManager = NST::analysis::AnalysisManager; using FiltrationManager = NST::filtration::Filtratio

tao546377318的博客 5634

PD3.0详解 第六章 协议层—数据消息之—VDM

PD3.0的VDM 很多对PD3.0协议了解不是很深入的同学可能对VDM有一些陌生,因为这个VDM是较为次要,只不过相对沟通电源的协议来讲VDM是次要,但从PD3.0协议的角度来说,这个也是非常重要的,是必须要非常明白的了解这个东西,所以今天大师匈就分享一下这部分的重要知识点。 VDM (vendor define message) VDM是什么意思呢,就是原厂定义的消息,比如PD快充芯片的原厂定义的一些自己独立的message。但是呢这部分也有规定的一些标准的字段。 另外我们要很清楚PD协议的数据分为几类

大师匈的博客 1万+

[C++] 理解静态变量只初始化一次的机制

#include<iostream> using namespace std; void foo() { int num = 4; for(int i = 0;i<10;i++) { /* static int snum = num; snum++; cout<<snu...

weixin_30360497的博客 223

51智能小车(双轮)

前几天接了个小单子,是一个基于51单品机的作品,发现自己对小车的认识还是不太🆗。也算是完成了任了的;欢迎各位小伙伴来多多交流,大家一起进步。最后有需要单片机课程设计的小伙伴滴滴我哦(有偿)。企鹅:2397746994。

qq_56992543的博客 2346

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PAT 1007 素数对猜想(20 分)C++

思路:用pre和i两个变量(pre代表旧的素数,i寻找新的素数)。第一个素数是2,所以给pre初始化为2。之后每找到一个素数便和前一个素数比较,将新的素数i赋值给pre,这样仅用2个变量就能遍历所有的素数。达到优化时间复杂度的目的,不容易超时 C++实现: #include<iostream> #include<cmath> using namespace std; int...

ganlanA的博客 535

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++递归实战:从Collatz猜想理解递归思想与优化技巧

递归是计算机科学中的核心概念,它通过函数自我调用的方式,将复杂问题分解为结构相似的子问题来解决。其原理在于定义明确的递归基(终止条件)和递归步骤,从而构建出清晰的求解路径。递归的技术价值在于提供了一种符合人类分治思维的问题解决范式,尤其适用于树形结构遍历、深度优先搜索和分治算法等场景,能使代码表达更简洁、逻辑更清晰。在工程实践中,递归常面临栈溢出和重复计算等性能挑战,需要通过记忆化等优化技术来提升效率。本文以经典的Collatz猜想(3n+1问题)为例,通过C++实现,深入探讨了递归的设计、优化及其在算法思

weixin_33834910的博客 788

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

PTA 乙级——1005继续(3n+1)猜想 C++实现

题目 继续(3n+1)猜想 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的...

qq_45677518的博客 330

C++实现角谷猜想:从数学谜题到编程实践与性能优化

在计算机科学中,算法是将问题求解步骤形式化描述的核心方法,其设计直接影响程序的效率与正确性。以经典的角谷猜想(Collatz猜想)为例,其规则简单却蕴含着深刻的迭代与递归原理。通过C++实现该猜想,不仅能巩固循环、条件判断和函数封装等基础编程概念,更能深入理解算法优化技术,如记忆化(Memoization)和动态规划。这些技术通过缓存中间结果避免重复计算,显著提升程序性能,在处理大规模数据验证时尤为重要。角谷猜想的实现过程,从基础模拟到健壮性处理(如输入验证和整数溢出防范),再到性能优化与数据可视化,完整展

dianwei5413的博客 462

【PAT】1007 素数对猜想

让我们定义dn​为:dn​=pn+1​−pn​,其中pi​是第i个素数。显然有d1​=1,且对于n>1有dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。先求出1~n的所有素数,存到a数组中。开一个变量ans记录答案,并初始化为0,再遍历a数组,如果当前数组元素和上一个数组元素差值为2,则计数ans++。(

m0_62531913的博客 400

C++11中列表初始化机制的概念与实例详解

定义:列表初始化是C++11引入的新标准,目的是统一初始化方式C++11以前只能使用列表初始化来初始化内置类型数组和POD类型对象,C++11中列表初始化可以用于初始化任何类型对象POD(plain old data)类型:仅由内置类型变量构成且不含指针的类,简单来说是可以直接使用memcpy复制的对象聚合体(aggregate):聚合体一定是POD类型无自定义构造函数无私有或保护的非静态数据成员(静态成员与单独对象无关,故不影响初始化)无基类无虚函数。

2501_94114815的博客 241

Learning C++ No.28 【C++11语法实战】

一文走进C++11,具体是人是鬼,一学便知

狂小伍的博客 2648

研究具有静态存储时期的变量的初始化时间

在探讨之前,我们先来普及一下基本知识。一下了3个知识点及截图皆参考C Primer Plus第五版。 1 对于任何一个C变量来说,它有且只有两种存储时期之一:静态存储时期或自动存储时期。 2 对于任何一个C变量来说,它必定是下面5中存储类之一,他们的存储时期见蓝色框内。 3 具有静态存储时期的变量,是在编译(我理解是生成可执行文件的过程,而不单指编译成目标文件)阶分配内存。请注意,这里说的是分配内存,并不是说初始化。

w13687130701的专栏 884

基于C++中for循环的一个猜想,并通过实验验证。不过没有理论支持。

源代码: { int sum=0; for(int i=0;i!=3;i++) { cout<<"第"<<i<<"次循环的时候,变量i的值为"<<i<<endl; sum+=i; } cout<<i<<su...

weixin_30662849的博客 95

Way on c & c++ 小记 [五] – 初始化列表与成员函参作用域

初始化列表与成员函参作用域 作者:Jason Lee @http://blog.csdn.net/jasonblog 日期:2010-04-11   [1]初始化列表 所谓初始化列表,从语法角度讲,就是构造函数圆括号后的冒号与左花括号之间的紧跟初始值的变量序列,如下是一个示例: Demo(): b(2), a(b){ 作为初始化列表,它以它的作用和初始化顺序而出名。

JasonLee的专栏 1644

变量、变量名、标识符、定义、声明

以下是我的个人见解,有不对的地方还请指出。 一。变量、变量名、标识符的区别 变量 变量提供了程序可以操作的有名字的存储区。C++ 中的每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可应用在该变量上的操作集。 变量名 变量名,即变量的标识符,可以由字母、数字和下划线组成。变量名必须以字母或下划线开头,并且区分大小写字母:C++ 中的标识

5522
上一篇: c++内存到底分几个区?!
下一篇: C语言编译全过程
MagicxiaoZ
博客等级 码龄19年 5粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值