首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++变量自动初始化问题

C++中有一些变量在如果没有赋初值会被编译器自动赋值为0,但有的变量又不会这样,而得到一个随机数,下面具体讨论一下: 首先看一下C++几个存储区: 1、栈区:由编译器自动分配释放 ,存放函数参数值...其操作方式类似于数据结构栈。     2、堆区:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构堆是两回事,分配方式倒是类似于链表,呵呵。    ...在上述几个存储区域中,如果定义在全局区变量没有被用户初始化的话,编译器会自动将其初始化为0。 这里要非常注意定义两个字而不是声明。...结论:一些全局变量(不管用没用static修饰)或者是使用static修饰局部变量在定义时候都会被编译器自动初始化为0,而在声明时候任何变量都不会被编译器自动初始化。...如static int num;如果放在函数任何位置都会被隐式初始化为0,但是如果是在类声明这样写就不会有值。

1.4K70

C++explicit关键字

1. explicit关键字 explicit中文含义是显示,在C++主要用于防止隐式转换发生。...:_value1: 2,在main函数,demo = 2就发生了隐式转换,用户类初始化。...如果加上explicit关键字又会是怎样,在Demo(int a)前面加上explicit,结果在编译时候就显示“no known conversion for argument 1 from ‘int...构造函数 C++explicit关键字只能用于修饰只有一个参数或者多参数情况下,除了第一个参数外其他参数都是默认值构造函数,对于无参或者除上述之外多参数构造函数是无效,如: class Demo...总结 C++explicit关键字可以防止隐式转换发生,在使用时注意如下几点: 只能用于修饰只有一个参数类构造函数,或者修饰多参数情况下除第一个参数外其余参数都是默认值构造函数; 无参构造函数或者多参数构造函数总是显示调用

54330
您找到你想要的搜索结果了吗?
是的
没有找到

C++voliate关键字

大家好,又见面了,我是你们朋友全栈君。 voliate变量是随时变化,用voliate修饰运算,编译器不进行优化,以免出错。...对于一个普通变量,为提高存取速率,编译器会先将变量值存储在一个寄存器,以后再取变量值时,就存寄存器取出。 但是用voliate修饰变量,就说明这个变量会发生意向不到改变。...也就是说,优化器每次在读取该值时,不会假设这个值了,每次都会小心在读取这个变量值,而不是在寄存器取保留备份。 那么,一个参数可以同时被const和voliate修饰吗?...答案是可以,如:只读状态寄存器。它是voliate,是因为它可能会发生意想不到改变;它是voliate,表示程序不应该试图去改变它。...voliate关键字应用场景 1、中断服务程序修改供其它程序检测变量需要加volatile; 2、多任务环境下各任务间共享标志应该加volatile; 3、存储器映射硬件寄存器通常也要加

23240

C++常量与关键字

图片宏常量 define,一般定义在文件头const 在代码定义常量使用方式不一样。...宏定义 #define 和常量 const 区别类型和安全检查不同宏定义是字符替换,没有数据类型区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量声明,有类型区别,需要在编译阶段进行类型检查编译器处理不同宏定义是一个...编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据存储方式不同宏定义是直接替换,不会分配内存,存储于程序代码段...;const常量需要进行内存分配,存储于程序数据段定义域不同void f1 (){ #define N 12 const int n 12;}void f2 (){ cout<<N...<<endl; //正确,N已经定义过,不受定义域限制 cout<<n <<endl; //错误,n定义域只在f1函数}定义后能否取消宏定义可以通过#undef来使之前宏定义失效const常量定义后将在定义域内永久有效

25830

C++auto关键字用法

auto 是 C++11 引入关键字,用于让编译器自动推导变量类型。它可以用于声明变量、函数返回类型、以及范围迭代器等地方。 以下是 auto 关键字主要用法: 1....函数返回类型推导(C++14+): C++14 引入了函数返回类型自动推导,允许在函数定义中使用 auto 作为返回类型占位符。...在需要明确指定类型情况下,尤其是在函数接口和公共代码,最好使用显式类型声明。 使用 auto 主要优势在于简化代码,尤其是在处理复杂类型、迭代器、以及模板。...它有助于提高代码可读性和可维护性。 总结: auto 是 C++ 一个强大工具,它能够减少代码模板和复杂类型书写,提高代码可读性。...然而,在使用时需要谨慎,避免过度使用,尤其是在函数接口和公共代码。在这些情况下,明确类型声明更有助于代码可理解性和可维护性。

12610

【面试宝典】C++const关键字用法

对于刚毕业应届生来说面试中经常被问到const关键字用法,小编在这里为大家总结如下: 修饰常量 用const修饰变量某种意义上就是常量,编译器会对它进行必要操作比宏定义多了类型修饰符。...需要注意是在声明时候要进行初始化,特别是在类类型,需要在初始化列表初始化。...修饰指针 (1)const int *p; p指针const int指针,不能用赋值语句对*p赋值,但是可以对p赋值。 (2)int* const p=&j; p是指向intconst指针。...放在返回值前修饰返回值表示返回值必须保持其常量性,不能被更改; 放在参数前修饰参数表示该参数必须保持其常量性,不能在函数体内被修改; (2)类成员函数 放在类成员函数尾部,表示其在函数内并不修改对象属性...,只是读取等操作非更易型操作 修饰类对象 当类对象被声明为const类型后,它只能调用用const修改成员函数。

73250

C++和Javastatic关键字比较

,Static 关键字用途几乎相同。...这篇文章涵盖了 C++ 和 Java static 关键字异同。  静态关键字 C++ 和 Java 之间相似之处: 静态数据成员可以用两种语言定义。 静态成员函数可以用两种语言定义。...静态关键字 C++ 和 Java 之间差异: C++ 不支持静态块。 Java 支持静态块(也称为静态子句)。它用于类静态初始化。 可以声明静态局部变量。 不支持静态局部变量。...下面详细讨论以上几点: 1.静态数据成员: 与C++一样,Java静态数据成员是类成员,在所有对象之间共享。例如,在下面的Java程序,静态变量count用于统计创建对象数量。...静态块: 与 C++ 不同,Java 支持一个特殊块,称为静态块(也称为静态子句),可用于类静态初始化。静态块这段代码只执行一次。 4.静态局部变量: 与Java不同,C++支持静态局部变量。

59620

C++ static关键字使用场景

详细介绍: 一、面向过程设计static 1. 静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。...总:静态全局变量 i 有以下特点: 该变量在全局数据区分配内存; 未经初始化静态全局变量会被程序自动初始化为0(自动变量值是随机,除非它被显式初始化); 静态全局变量在声明它整个文件都是可见,...对于一个完整程序,在内存分布情况如下图: ? 一般程序由new产生动态数据存放在堆区,函数内部自动变量存放在栈区。...静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈,每次值保持到下一次调用,直到下次赋新值。.../*code*/ } 定义静态函数好处: 静态函数不能被其它文件所用; (限定作用域) 其它文件可以定义相同名字函数,不会发生冲突; 二、面向对象static关键字(类static关键字

3.1K40

c++explicit和mutable关键字探究

今天说一说c++里面的两个关键字explicit和mutable。...1. explicit关键字 在写c++标准输入输出相关文章,查看iostream实现代码时候,经常看到构造函数前面带有explicit关键字,那么它到底有什么作用呢。...set函数,直接就改变了私有成员值,这就相当于,你自己房子里面放钱,别人可以隔墙修改你数量,想想看,你有10000块钱放家里,有个人手指一点,钱变成100了,是不是很可怕。...那么为什么explicit可以起到这个作用呢,在没有声明该关键字之前,编译器根据当前定义和构造函数,在编译时候做了一个隐式类型转换,但是当编译器发现了explicit这个关键字之后,就不再做这个隐式转换...2. mutable关键字 mutable用于类非静态和非常量数据成员,一般类成员函数被声明为const,就表示不会修改类数据成员,但如果要在常成员函数修改类非静态和非常量数据成员,则可以使用

24920

掌握C++static关键字多种使用场景

static是什么 在最开始C引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class概念,现在static可以修饰对象分为以下5种: 成员变量,成员函数,普通函数,局部变量...可以在一定程度上解决命名冲突问题,不过C++提供了namespace,所以一般不用于修饰普通函数。...count = 2; 局部变量 void print() { static int a = 0; ++a; cout << a << endl; } 底层原理 之所以被static修饰变量或者函数生命周期会超越支配其所在作用域本质是因为它在内存存储位置发生了变化...,如果是new关键字定义就存放在堆区,否则就在栈区。...如果是堆区对象,不会随着作用域离开被析构,只能通过delete关键字手动释放或者程序结束后被操作系统自动回收 而static修饰之后,操作系统会将该变量存放在全局区,全局区变量只会初始化一次,并且在程序结束后被操作系统回收

29410

学习c++问题总结

1.类函数定义后加了一个const代表什么? 代表它将具备以下三个性质:   1.const对象只能调用const成员函数。  ...2.const对象值不能被修改,在const成员函数修改const对象数据成员值是语法错误   3.在const函数调用非const成员函数是语法错误   任何不会修改数据成员函数都应该声明为...如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序健壮性。   ...所以看完上面这句话就应该明白了函数定义后加const用处,以及什么时候用到const,这会是一个好编程习惯。...以下程序,类stack成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数错误。

68220

C++与Cconst关键字有何差别?

前言 在《const关键字到底该怎么用》一文中介绍了C语言中const关键字,本文说说C++const关键字,它大部分特点和C语言中类似,所以本文主要针对不同之处。...但是,千万不要写这样代码!!! 与C语言中const关键字不同是,C++中使用const关键字定义b变量值在被改变时会被检测。...,这里只是为了说明问题。...即下面的声明是非法: static void printA() const 修饰类成员变量--构造函数初始化 与修饰普通变量不同是,修饰类成员变量还可以在构造函数初始化。...总结 关于const关键字在C和C++区别,想必到这里你已经清楚了。const关键字通常能借助编译器帮助我们提前发现一些不易察觉问题

67500

c++typename、typedef以及using关键字用法

c++标准库,因为类继承关系比较复杂和模板使用比较多原因,源代码充斥着typename、typedef和using这三个关键字,所以在继续剖析标准库源码之前,今天就来介绍一下这三个关键字作用...一、typename关键字 typename第一个作用是用作模板里面,来声明某种类型,比如这样: template struct...三、using关键字 对于using关键字,最开始知道是因为这行代码: using namespace std; 所以它第一个作用就是声明命名空间,使用形如using namespace 命名空间名...,此处是引入父类保护类型成员变量,对于这种用法,我们不展开多说,只要知道有这样作用,以后看到了这样代码知道它是怎么个意思就行了。...好了,关于三个关键字简单介绍就到这里了,下篇文章再会呀。

90130

C++ auto 关键字使用

C++98 auto早在C++98标准中就存在了auto关键字,那时auto用于声明变量为自动变量,自动变量意为拥有自动生命期,这是多余,因为就算不使用auto声明,变量依旧拥有自动生命期:int...a =10 ; //拥有自动生命期auto int b = 20 ;//拥有自动生命期static int c = 30 ;//延长了生命期C++98auto多余且极少使用,C++11已经删除了这一用法...C++11 autoauto可以在声明变量时候根据变量初始值类型自动为此变量选择匹配类型,类似的关键字还有decltype。...程序运行结果输出了 int 这种用法就类似于C#var关键字。auto自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率降低。...decltype操作符用于查询表达式数据类型,也是C++11标准引入运算符,其目的也是解决泛型编程中有些类型由模板参数决定,而难以表示它问题

3.9K31

那些陌生C++关键字

那些陌生C++关键字 学过程序语言的人相信对关键字并不陌生。偶然间翻起了《C++ Primer》这本书,书中列举了所有C++关键字。我认真核对了一下,竟然发现有若干个从未使用过关键字。...C++使用typename情况有两种: 第一种情况是在函数模板和类模板声明。一般模板声明,使用class关键字指定类型参数,后来C++支持使用typename代替class关键字。...其实这些问题在目前编译器并不存在,使用VC6.0和VS2010测试发现,无论是否加上typename程序都不会出错。对该关键字保留大概是为了兼容旧式编译器代码。...五、explicit Explicit含义是显式,它和C++隐式转换相关。例如: double a=100; 编译器会自动将整数100转化为浮点类型。...至此,我们把那些陌生C++关键字“老底”摸了个遍,相信以后应该不会再碰到搞不清楚C++关键字了,希望本文对你有所帮助!

91670
领券