为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题。
类声明:
class Screen;   //Screen类的声明
类定义:
class Screen{    //Screen类的定义
    //etc...
};       
当用实例化一个类的对象时,编译器会根据类的定义来分配相应的存储空间。也就是说,在创建对象前,一定要有完整的类定义,这样编译器才能正确的计算所需空间。
那么我们来看如下代码:
class Screen{
    Screen sc;    //error, 'sc' uses undefined class 'Screen'
    //etc...
};
上述代码中,由于Screen还没有定义结束,在内部定义一个Screen类型的对象时,编译器无法知道应该为sc分配多少空间,因此会报注释中的错误。
我们再看下面一段代码:
class Screen{
    Screen *sc1;   //ok
    Screen &sc2;   //ok
};
在类定义时,已指向自身类型的指针或引用作为数据成员则没有问题。按照前面的介绍就很好理解了,由于指针和引用所占存储空间大小与类型无关,所以编译器可以计算分配空间,所以正确。
还看到一个从对象构造过程的角度解释这个问题的答案,贴在这里:(原网页链接为参考资料的第二个)
因为如果类包含自身类的对象,存在无限初始化的问题。
构造一个类的对象是,先构造成员变量,然后再调用自身的构造函数,如果类包含自身的的对象,那么在调用构造函数之前,需要先构造自身类的对象。而构造自身类的对象时,又得先构造自身的对象,然后调用其构造函数……
为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?的更多相关文章
- YTU 2618: B 求类中数据成员的最大值-类模板
		
2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec 内存限制: 128 MB 提交: 430 解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...
 - synchronized 方式实现监控器中数据成员的同步
		
要对监控器中的数据成员进行访问,在考虑到多线程的情况下必须使用同步代码块来改变监控器中数据成员的值: synchronized (mAdapterLocking) { if (pEvery == 0) ...
 - 类4(可变数据成员/基于const的重载)
		
可变数据成员: 有时我们希望能修改某个类的数据成员,即使是在一个 const 成员函数内.可以通过在变量的声明中加入 mutable 关键字来声明一个可变数据成员.mutable 是为突破 const ...
 - c++类  初始化const数据成员
		
对于const或引用类型的类成员,唯一的初始化方式是在构造函数中使用成员函数初始化列表.构造函数体中的赋值语句是无效的 正确 #include<iostream> using namesp ...
 - C++中默认构造函数中数据成员的初始化
		
构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据 ...
 - Cocos2d-x 3.1.1 学习日志3--C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员
		
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011292087/article/details/37598919 有关const成员.stati ...
 - 编写一个矩形类,私有数据成员为矩形的长(    len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。
		
class Rectangle { private double len, wid; public Rectangle()//求矩形周长 { len = 0; wid = 0; } public Re ...
 - C++类中的static数据成员,static成员函数
		
C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在, ...
 - 正确理解Widget::Widget(QWidget *parent) :QWidget(parent)这句话(初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数)
		
最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) ...
 
随机推荐
- jsp学习一
			
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1&q ...
 - groovy-闭包
			
什么是闭包 一个groovy闭包就像一个代码块或者方法指针,他是定义然后执行的一段代码,但是他有一些特性:隐含变量,支持自由变量,支持currying . 我们先来看看一些例子: 1 def clos ...
 - c3p0配置详解
			
数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. 一.实现方式: C3P0有三种方式实现: 1.自己动手写代码,实现数据源 例如: ...
 - 【wget】一条命令轻松备份博客(包括图片)
			
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
 - epoch iteration batchsize
			
深度学习中经常看到epoch. iteration和batchsize,下面按自己的理解说说这三个的区别: (1)batchsize:批大小.在深度学习中,一般采用SGD训练,即每次训练在训练集中取b ...
 - DedeCMS 5.7 后门漏洞
			
简要描述: DedeCMS V5.7 SP1正式版 UTF-8 GBK版本疑似被植入一句话后门 前几日下载并不存在此代码 详细说明: shopcar.class.php被植入一句话@eval(file ...
 - Linq 中 表连接查询
			
public void Test(){ var query = from a in A join b in B on A.Id equals B.Id into c from d in c.Defau ...
 - R-squared是什么意思
			
在回归分析中,R-squared值应该为多大? 就像经常被问到,在回归分析中,R平方应该为多大才表示回归模型是好的?我经常能够听到这类问题,在没回答这个问题之前,我会解释如 何来解释R平方值,我也会阐 ...
 - cnblog可以直接黏贴qq截图,但最好不要偷懒
			
秋秋(qq)基本上算是ytkah本人开机后要开的软件了,平时也习惯用Ctrl+Alt+A快捷键来进行截图.很早以前ytkah一个无意间发现cnblog可以直接黏贴qq截图,当时截图后可能是忘记黏贴到其 ...
 - cf.VK CUP 2015.B.Mean Requests
			
Mean Requests time limit per test 4 seconds memory limit per test 256 megabytes input standard input ...