1.类中数据成员的声明与初始化总结

在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样

  1. class A

  2.  

    { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字

为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。

什么东西能在类内初始化

能在类中初始化的成员只有一种,那就是静态常量成员。

这样不行

  1. class A

  2.  

    { private: static int count = 0; // 静态成员不能在类内初始化 };

这样也不行

  1. class A

  2.  

    { private: const int count = 0; // 常量成员也不能在类内初始化 };

但是这样可以

  1. class A

  2.  

    { private: static const int count = 0; // 静态常量成员可以在类内初始化 };

结论:

  • 静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化;
  • 静态非常量数据成员只能在类外,即类的实现文件中初始化,也不能在构造函数中初始化,不能在构造函数的初始化列表中初始化;
  • 非静态的常量数据成员不能在类内初始化,也不能在构造函数中初始化,而只能且必须在构造函数的初始化列表中初始化;
  • 非静态的非常量数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表中初始化;

总结如下表:


类型 初始化方式


类内(声明)


类外(类实现文件)


构造函数中


构造函数的初始化列表


非静态非常量数据成员


N


N


Y


Y


非静态常量数据成员


N


N


N


Y (must)


静态非常量数据成员


N


Y (must)


N


N


静态常量数据成员


Y


Y


N


N

以下三种类型必须通过初始化列表来初始化
1.非静态 常量

2. 引用类型

3. 没有默认构造函数的类类型

链接:https://blog.csdn.net/sylar2016/article/details/79257175

原文地址:https://www.cnblogs.com/zhihaospace/p/11986624.html

时间: 2024-11-11 16:19:54

1.类中数据成员的声明与初始化总结的相关文章

第十六周oj刷题——Problem C: B 求类中数据成员的最大值-类模板

Description 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值. Input 分别输入3个整数,3个浮点数,3个字符 Output 3个整数的最大值 3个浮点数中的最大值 3个字符中的最大值 Sample Input 9 5 6 1.1 3.4 0.9 a b c Sample Output 9 3.40 c /* All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 6 月 25 日

C++对象中数据成员的布局

首先,对于类中定义的变量,各个编译器内部并没有强制规定成员布局的情况. 只有一些简单的标准: 1    在同一个访问控制标号(public,private,protected)中定义的非static变量在对象的内存布局顺序是按照定义的顺序. 2    不同的访问控制标号下的(非static)成员变量并无先后顺序的要求. 3    编译器可能还会合成一些内部使用的数据成员,比如虚函数表的指针vptr:C++标准并没有规定那些内部产生的指针的位置 在内存中的位置,甚至可以放在其他成员变量之间. 比如

C#类中的成员

@ 目录 字段 属性 方法 构造函数 类和对象的简单解释 创建类和对象 类中成员的归属问题 字段 字段的声明与声明变量类似,可以添加访问修饰符,通常情况下字段设置为私有的,然后定义属性对字段的读写进行限制 一般的命名规范约定,私有字段使用下划线前缀.小驼峰命名 private int _age //定义一个私有字段_age 属性 属性拥有两个访问器(get和set),用于控制读取和写入,通常和字段配套使用,用来对字段进行读写限制 //定义一个Age属性,限制赋值给_age字段的值为18到60岁之

java类中各成员初始化的顺序

了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println("父类代码块初始化" ); } private static String s=print(); public static String print() { System. out.println

学习IOS开问题篇--类中的成员变量如果不实例化是什么情况

@interface Person : NSObject @property (noatonmic,copy) NSString * name; @end 一个person类,name是person得成员变量 如果在一个类中写入person为成员变量 self.person.name = @"zhangsan"; 如果前面不将person实例化,实际上是在对一个空指针进行操作 [nil setname:@"zhangsan"]; 因为oc中对空指针发消息不会报错,所

c++ 类中模版成员函数

C++函数模版与类模版. template <class T> void SwapFunction(T &first, T &second){ }//函数模版 template <class T>//类模版 class CTemplate{ public: void SWap(T &first, T &second){ } }; #include <iostream> class Single{ public: static Single

一个类在另一个类中以集合形式声明为属性时应该注意的问题

标题:一个类在另一个类中以集合形式声明为属性时应该注意的问题,先解释一下,看下面的代码吧 [Serializable] public class MO_T_sj_quest { public List<MO_T_sj_answer> AnswerList { get; set; } public List<MO_T_sj_answer> IDList { get; set; } public List<MO_T_sj_quest_bind> BindList { get

类中的成员

类中的成员:字段.方法.属性 1.字段 字段:普通字段.静态字段 1 class Mycalss: 2 str = '这是静态字段' 3 def __init__(self,str1): 4 self.str1 = str1 # 普通字段 5 # 实例化对象 6 a = Mycalss('普通字段') 7 print(a.str1) #访问静态字段 8 print(Mycalss.str) 执行结果 普通字段 这是静态字段 普通字段:属于对象,由对象来访问,在内存中每个对象都要保存一份 静态字段

第十六周oj刷题——Problem I: 改错题:类中私有成员的访问

Description 改错题: 设计一个日期类和时间类,并编写全局函数display用于显示日期和时间.要求:display函数作为类外的普通函数,而不是成员函数 在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年.月.日和时.分.秒. Input 年      月       日 时      分       秒 Output 年/月/日 时:分:秒 Sample Input 2013 12 23 14 23 50 Sample Ou