类中的静态成员变量 非静态成员变量的初始化问题
2013-10-09 19:31
302 查看
#include <iostream>
using namespace std;
struct a
{
int m;
};
struct b : public a
{
int n =8;
};
int n =8这行报错,因为类的非静态成员不能在类中初始化。
1. 为什么类的静态成员变量不能在类中初始化
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样
为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
2.为什么类的非静态成员也不能在类中初始化
定义类的时候并没有分配内存这时候赋值的话值放在哪里呢? 当用类构造对象的时候首先分配内存然后调用构造函数这时候才可以初始化非静态成员变量。
类的静态成员变量和方法属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)
属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。(访问的这个非静态成员必须是属于某个实例才行)
.
using namespace std;
struct a
{
int m;
};
struct b : public a
{
int n =8;
};
int n =8这行报错,因为类的非静态成员不能在类中初始化。
1. 为什么类的静态成员变量不能在类中初始化
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样
class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字
为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
2.为什么类的非静态成员也不能在类中初始化
定义类的时候并没有分配内存这时候赋值的话值放在哪里呢? 当用类构造对象的时候首先分配内存然后调用构造函数这时候才可以初始化非静态成员变量。
类的静态成员变量和方法属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)
属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。(访问的这个非静态成员必须是属于某个实例才行)
.
相关文章推荐
- HDU 4485 B-Casting (基础题)
- Xcode5 上使用Base SDK iOS6程序和iOS6模拟器
- (C语言)单链表的顺序实现(数据结构一)
- 大数水题PAT 1065
- CPU,MPU,MCU,SOC,SOPC联系与差别
- Android基于XMPP Smack Openfire下学习开发IM(六)总结
- ant 一键打包
- 数据库系统原理
- 有关布局
- 循环 执行计划 索引
- 排序数组中重复最对的数字长度
- Java SE学习笔记(三)
- 【递推】wikioi 1509 拯救LongMM
- JSON与XML
- ASIHTTPRequest 中url参数中文乱码
- hibernate之自定义持久化实现
- [置顶] 设计模式系列4-抽象工厂模式
- Centos试安装Traffic server的各种错误
- Android高效加载大图、多图解决方案,有效避免程序OOM
- Visual C#2008从入门到精通(奋斗的小鸟)_PDF 电子书