整理于:

http://blog.csdn.net/heyutao007/article/details/6649741

http://blog.sina.com.cn/s/blog_68d90fdb0100yapr.html

1. 前向声明好处

1)不必要的#include   会增加编译时间. 
2)混乱随意的#include可能导致循环#include,可能出现编译错误.

2. 定义

可以声明一个类而不定义它。这个声明,有时候被称为前向声明(forward declaration)。比如class Screen; 在声明之后,定义之前,类Screen是一个不完全类型(incompete type),即已知Screen是一个类型,但不知道包含哪些成员,具有哪些操作。不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数
      类的前向声明只适用于指针和引用的定义,如果是普通类类型就得使用include了。

class A;
class B
{
public:
A* m_a; //(不能A m_a)
static A m_a2;//这个是可以的,因为静态成员变量不占用类对象的大小,是存在静态区的,所以不影响,记住:目的是c++编译器可以确定对象的大小
};

3. 前向声明的限制

(1)不能定义foo类的对象;
(2)可以用于定义指向这个类型的指针或引用。(很有价值的东西);
(3)用于声明(不是定义)使用该类型作为形参或者返回类型的函数。

4. 实例

c++编译器做的事情主要是:1.扫描符号;2.确定对象大小。
所以很多时候并不需要将类都include进来。
比如:
(1)由于所有对象类型的引用所占用的空间都是相同大的,所以c++编译器很好确认对象大小(引用的大小???)。

class string;
class Sample
{
private:
string &s;
};

这里只需要做一个string的前向声明就可以了,不需要#include <string>

(2)由于所有类型的指针也是相同大小的。所以与(1)类似,也可以只做前向声明就好。

(3)声明成员函数的形参或者是返回类型,也可以利用前向声明的性质。

class string;
class foo;
class Sample
{
public:
foo foo_test(foo &);
private:
string &s;
foo *f;
};

这里,我根本没有定义一个foo类,但是还是可以这样用,因为成员函数不占类对象的大小,所以c++编译器还是可以确定对象的大小(注:换句话说是否只要C++编译器能确定对象大小即可)
      前向声明的作用在于告诉编译器这是一个在别的地方定义的类型。这样C++编译器就能生成正确的符号表了。

(4) 即使前向声明一个没有定义的类,devc++也可以编译通过,如下所示:
#include <iostream>
using namespace std; class B;
class foo; B func(); class A
{
public:
B* t;
public:
foo foo_test( foo & );
}; class B
{
public:
int a;
public:
B() {}
virtual int add()
{
return ;
}
static int c;
}; int main()
{
A a;
return ;
}

上面代码也可以编译运行,即使没有看到class foo的定义;

转自:http://blog.csdn.net/damotiansheng/article/details/50916394

c++中的前向声明的更多相关文章

  1. 转 : c++ 结构体 前向声明

    typedef struct tag_guid { ULONGLONG utime; ULONGLONG umac; }tpguid; class A { private: int m_teset1; ...

  2. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  3. C++ 类的前向声明

    前向声明 在计算机程序设计中, 前向声明是指声明标识符(表示编程的实体,如数据类型.变量.函数)时还没有给出完整的定义.即可以声明一个类而不定义它,只声明类但不知道类的成员变量.函数等具体细节. 如: ...

  4. 类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等

    一.类声明 //类是一种用户自定义类型,声明形式: class 类名称 {    public:              公有成员(外部接口)    private:              私有 ...

  5. 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  6. C++ 类的前向声明的用法

    我们知道C++的类应当是先定义,然后使用.但在处理相对复杂的问题.考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖. 例如: class A { public: void f(B ...

  7. C++面向对象 - 类的前向声明的用法

    C++中的类应当是先定义,然后使用.但在处理相对复杂的问题,比如考虑类的组合时,有可能遇到两个类相互引用的情况,这种情况称为循环依赖. 考虑下面代码: class A { public: void f ...

  8. 探究C语言中的前++和后++

    小波带您探究c语言中的前++与后++: 欢迎吐槽,欢迎加QQ463431476. 欢迎关注!  现在来探究: 咱们先看第一个 i被赋值0,i++(后++)并没有输出1.   现在i被赋值0,++i,也 ...

  9. C++中类的前向声明的用法

    原创文章,未经博主允许禁止转载. C++的类可以进行前向声明.但是,仅仅进行前向声明而没有定义的类是不完整的,这样的类,只能用于定义指针.引用.以及用于函数形参的指针和引用.而不能定义对象(因为此时编 ...

随机推荐

  1. UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  2. Python modf() 函数

    描述 modf() 方法返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示. 语法 以下是 modf() 方法的语法: import math math.modf( x ) 注 ...

  3. scikit-learn 入门

    简介: scikit-learn是一个基于NumPy.SciPy.Matplotlib的开源机器学习工具包.採用Python语言编写.主要涵盖分类. 回归和聚类等算法,比如knn.SVM.逻辑回归.朴 ...

  4. 支持向量机(SVM):应用实例

     SVM 应用实例(人脸识别): from __future__ import print_function from time import time import logging import m ...

  5. yii2 数据库操作详解(转载)

    开始使用数据库首先需要配置数据库连接组件,通过添加 db 组件到应用配置实现("基础的" Web 应用是 config/web.php),DSN( Data Source Name ...

  6. 使用 bat cmd命令杀掉 删掉运行的程序

    删掉所有xx.exe开启的进程 taskkill /f /im xx.exe 开启xx.exe start xx.exe 根据标题栏信息删除 taskkill /f /FI "windows ...

  7. jQuery.ajax() 如何设置 Headers 中的 Accept 内容

    其实很简单,首先如果是常见类型,则请直接设置 dataType 属性 $.ajax({ dataType: "json", type: "get", succe ...

  8. ASP.NET Web API 中 特性路由(Attribute Routing) 的重名问题

    刚才忘了说了,在控制器名重名的情况下,特性路由是不生效的.不然的话就可以利用特性路由解决同名的问题了. 而且这种不生效是真的不生效,不会提示任何错误,重名或者什么的,直接会报告404,所以也是个坑.

  9. vi作者:Bill Joy

    威廉·纳尔逊·乔伊(William Nelson Joy,1954年11月8日-),通称比尔·乔伊(Bill Joy),美国计算机科学家.与Vinod Khosla.Scott McNealy和And ...

  10. 【Android】12.5 利用Intent读取和更新通讯录

    分类:C#.Android.VS2015: 创建日期:2016-02-23 修改日期:2016-03-08更正了未关闭cursor的bug.  一.简介 本节演示如何在安卓系统中通过用户配置文件(us ...