C++基础之 成员变量初 始化赋值
摘要: C++成员变量 初始化赋值 你都清楚吗?还有好多坑,好多细节也不知道。。。
今天在写一个类的时候,由于该类的一个成员变量是引用,所以初始化出现了问题,查了一下之后,才发现,原来引用的初始化和const常量 一样只能在构造函数的初始化列表里初始。突然发现自己的C++基础本科的时候学的有待重温。
至于为什么成员变量中要用到引用,这个主要是该成员变量是另一个类的对象,但是该类却禁止copy【怎么禁止拷贝构造函数?其实很简单,声明为Private即可】。
注解:
在 C++ 标准中(除了C++11版本以后), 类的成员变量的初始化都是在构造函数中实现的,而不能在类中设定默认值。其中,有三类成员变量比较特殊,就是静态类型成员变量,const常量类型成员变量, 引用类型成员变量。
1.引用的初始化和const常量 一样只能在构造函数的初始化列表里初始。
2.静态类型 成员变量 只能在类体外定义 及 初始化。
#include <iostream>
#include <string>
using namespace std; class TestVar{
public:
TestVar():b(), e(a)
{
a = ;
cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<h<<endl;
}
//private:
public:
//int a = 0;//error: ISO C++ forbids initialization of member ‘a’
int a;//初始化可以在构造函数里面,也可以在初始化列表
//const int b = 0;//error: ISO C++ forbids initialization of member ‘a’
const int b;//常量的正确初始化应该使用[构造函数的初始化列表]
int &e;//引用类型变量,和常量一样只能在[构造函数的初始化列表],参数是同类型变量 //static int c = 0;//ISO C++ forbids in-class initialization of non-const static member ‘c’
static int c;
static const int d = ;//注意只有整型数据才行[int.., char]
static const char f = 'a';//可以,char也是整型数据
static const double h = 9.9;//书上说不行,但是在g++下是可以的,根编译器有关吧
};
int TestVar::c = ;//静态成员的正确初始化方法 int main()
{
TestVar t;
t.a++;
cout<<t.a<<" "<<t.e<<endl;
return ;
}
运行结果:
修改构造函数为:
public:
TestVar():b(), e(a)
{
cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<h<<endl;
a = ;
}
运行结果:
有上面对比发现, 构造函数的初始化列表是在 构造函数体 运行开始之前 最早运行的。
此时, b 被赋值为2, a变量没有被初始化为随机值 4197184 , e为a 的引用 所以 e值也为 4197184 。
源地址:
https://my.oschina.net/chengshuguang/blog/210666
C++基础之 成员变量初 始化赋值的更多相关文章
- 【java基础】成员变量和局部变量02
成员变量和局部变量(2) 成员变量的初始化和内存中的运行机制 当系统加载类或者创建类的实例的时候,系统会自动为成员变量分配内存空间,并自动指定初始值. package object; ...
- 【java基础】成员变量和局部变量
成员变量和局部变量 根据定义变量位置的不同,可以将变量分为成员变量和局部变量 成员变量是在类范围内定义的变量 局部变量是在一个方法内定义的变量 成员变量可以分为: ...
- OC基础--对成员变量的封装
#import <Foundation/Foundation.h> //日期结构体 typedef struct{ int year; int month; int day; } Date ...
- 【Java基础】成员变量和局部变量的区别
在类中的位置不同 成员变量:在类内部方法外部 局部变量:在方法体内部定义的或者方法的参数中定义的在内存中的位置不同 成员变量:在堆内存,有初始化值,byte,short,int,long->0, ...
- java基础之成员变量与局部变量
成员变量的含义 局部变量的含义 成员变量与局部变量的区别
- 第3章 Java语言基础----声明成员变量,对变量进行赋值
声明成员变量,对变量进行赋值的正确语句,如下图所示:
- ES6 - 基础学习(3): 变量的解构赋值
解构赋值概述 1.解构赋值是对赋值运算符的扩展. 2.它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值. 3.代码书写上显得简洁且易读,语义更加清晰明了:而且还方便获取复杂对象中的数据字 ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- c++,给常成员变量赋值
C++中,常成员变量只能在构造函数赋值,且只能通过参数列表的形式赋值,且必须在构造函数赋值. (拥有常成员变量的类的构造函数必须对所有成员变量赋值.) #include <iostream> ...
随机推荐
- python 千位分隔符,
>>>) >>>'1,234,567,890'
- 推荐一款基于Angular实现的企业级中后台前端/设计解决方案脚手架
ng-alain 是一个企业级中后台前端/设计解决方案脚手架,我们秉承 Ant Design 的设计价值观,目标也非常简单,希望在Angular上面开发企业后台更简单.更快速.随着『设计者』的不断反馈 ...
- union和union all比较说明
执行sql语句:select '1' union select '3' union select '2' union select '1' 得到的结果集如下: 执行sql语句如下: select ' ...
- axios构建请求池处理全局loading状态&&axios避免重复请求
很多时候我们能够看到类似进度条一样的东西在页面顶部进行加载,代表页面是否加载完成,或者其他的loading效果,我们当然不可能通过promise.all来讲所有的请求合并到一起然后进行处理,这个时候我 ...
- 用STL对一组数组进行排序和去重
#include <iostream> #include<cmath> #include "algorithm" #include "cstdio ...
- Eclipse用了官方汉化后,无法输入
解决方法:Rclipse右键→属性→兼容性→windows vista
- CSS样式属性——字体+文本
CSS属性可分为以下几类:字体.背景.文本.位置.布局.边缘.列表 1. 字体——主要包括文字的字体.大小.颜色.显示效果等基本样式 font-family:用于设置字体系列 font-size:字体 ...
- java使用HttpClient
HttpClient常用的包有两个 org.apache.http.client以及org.apache.commons.httpclient 我常用的是org.apache.http.client. ...
- spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志
spring boot 各版本中使用 log4j2 记录日志 前言 Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback.为了更好支持 spring boot 框架 ...
- linux kernel swap daemon
The name swap daemon is a bit of a misnomer as the daemon does more than just swap modified pages ou ...