C++ 类前向声明
2014-03-10 09:51
197 查看
在一个群内看到的消息,关于类的前向声明:
前向引用声明,在提供一个完整的类声明之前,不能声明该类的对象;可以做函数参数 或者声明对象指针;
class A并不是真正意义声明A类,只是告诉编译器,从现在开始碰到的符号A是一个类,以保证符号识别。因此使用A a;编译器不知道类A有没有构造函数,也不知道该为对象a分配多大空间;
下面部分转自 http://blog.sina.com.cn/s/blog_68d90fdb0100yapr.html
前向声明的定义:有些时候我们可以声明一些类但是并不去定义它,当然这个类的作用也很有限了。
比如class foo;
声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪些成员,具有哪些操作)都不知道。
因此这个类的作用也很有限.
(1)不能定义foo类的对象。
(2)可以用于定义指向这个类型的指针或引用。(很有价值的东西)
(3)用于声明(不是定义)使用该类型作为形参或者返回类型的函数。
正因为有前向声明的存在,我们在很多时候可以简便的做一些事情。
在c++中,如果要为类编写头文件的话,一般是要#include一堆头文件的,但利用前向声明和c++编译器的特性,其中大部分是不需要的。
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++编译器就能生成正确的符号表了。
前向引用声明,在提供一个完整的类声明之前,不能声明该类的对象;可以做函数参数 或者声明对象指针;
class A并不是真正意义声明A类,只是告诉编译器,从现在开始碰到的符号A是一个类,以保证符号识别。因此使用A a;编译器不知道类A有没有构造函数,也不知道该为对象a分配多大空间;
下面部分转自 http://blog.sina.com.cn/s/blog_68d90fdb0100yapr.html
前向声明的定义:有些时候我们可以声明一些类但是并不去定义它,当然这个类的作用也很有限了。
比如class foo;
声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪些成员,具有哪些操作)都不知道。
因此这个类的作用也很有限.
(1)不能定义foo类的对象。
(2)可以用于定义指向这个类型的指针或引用。(很有价值的东西)
(3)用于声明(不是定义)使用该类型作为形参或者返回类型的函数。
正因为有前向声明的存在,我们在很多时候可以简便的做一些事情。
在c++中,如果要为类编写头文件的话,一般是要#include一堆头文件的,但利用前向声明和c++编译器的特性,其中大部分是不需要的。
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++(24)好大一个箱子!5.1.1 函数的声明和定义
- C++的模板的声明和定义
- c++学习笔记之基础---类内声明线程函数的调用
- c++中的前向声明
- C++异常接口声明和使用详解try catch throw
- C++引用之声明方法
- 如何理解c和c++ 的复杂类型声明
- C++中的定义和声明
- 解读复杂的C/C++声明[实战篇]
- C++程序设计语言--第四章:类型和声明
- C++访问声明
- C++ 类的声明
- C++中的前向声明
- 如何理解C和C++的复杂类型声明
- C++ 关于声明,定义,类的定义,头文件作用,内、外链接
- 立此存照(18)[C++]using声明与using指示的区别
- [C++再学习系列] 变量与声明时初始化
- C++模板编程:如何使非通用的模板函数实现声明和定义分离
- [编程技巧] C++中优化BOOL 变量的声明
- C++变量定义及声明的区别