c++类定义代码的分离
类文件
实际工程中,对一个类的说明、架构、描述方法是: 往往分成头文件和实现的源文件,来实现代码的分离
然后,源文件中包含类的头文件...
头文件的包含问题:
类对应的实现文件cpp、main主函数文件,都要包含类的头文件,因为要“单独”编译;
main函数、其他文件要使用这个类的时候,都只需要包含该类的头文件足矣( 使用时、“编译”时, 无非是引用该
类的成员和方法),而这些成员和方法已经在头文件中声明(或定义了);
至于具体的实现代码,在链接的时候,是由linker “自动“ 寻找该类对应的源文件cpp, 过程我们不必关心.
头文件
头文件的所有内容,都必须包含在
#define {Filename}
//{Content of head file}
#endif
这样才能保证头文件被多个其他文件引用(include)时,内部的数据不会被多次定义而造成错误
inline限定符
在头文件中,可以对函数用inline限定符来告知编译器,这段函数非常的简单,可以直接“ 嵌入“ 到调用定义之处。
当然inline的函数并不一定会被编译器作为inline来实现,如果函数过于复杂,编译器也会拒绝inline。
因此简单说来,代码最好短到只有3-5行的才作为inline。有循环,分支,递归的函数都不要用做inline。
对于在类定义内定义实现的函数,编译器自动当做有inline请求(也是不一定inline的)。
函数成员
函数成员无论是否带有static限定符,其申明都放在.h文件的类定义内部。
对于要inline的函数成员其定义放在.h文件;其他函数的实现都放在.cpp文件中。
数据成员
数据成员的申明与定义都是放在.h文件的类定义内部。对于数据类型,关键问题是其初始化要放在什么地方进行。
对于只含有static限定符的数据成员,它的初始化要放在.cpp文件中。因为它是所有类对象共有的,因此必须对它做合适的初始化。
对于只含有const限定符的数据成员,它的初始化只能在构造函数的初始化列表中完成。因为它是一经初始化就不能重新赋值,因此它也必须进行合适的初始化。
对于既含有static限定符,又含有const限定符的数据成员,它的初始化和定义同时进行。它也是必须进行合适的初始化
对于既没有static限定符,又没有const限定符的数据成员,它的值只针对本对象可以随意修改,因此我们并不在意它的初始化什么时候进行。
模板的定义
因为模板的这种特殊性,它并没有自己的准确定义,因此我们不能把它放在.cpp文件中,而要把他们全部放在.h文件中进行书写。这也是为了在模板具体化的时候,能够让编译器可以找到模板的所有定义在哪里,以便真正的定义方法。
类定义语句
类定义是一种类型定义语句,后面要加分号,这里的{ }跟if,for等语法结构中的大括号不同
一开始写class clsName的时候就在{ }后面加上;分号
类里面的static,const修饰符
1. 类的成员函数
static修饰成员函数,表示:该成员函数逻辑上属于类;而且表示它只能操作静态数据成员、全局变量、自己的参数,
由于属于类, 没有this指针, 所以它不会去操作 “非静态“ : 数据成员: 非静态成员函数(“非静态”的东西,必须要具体的对象、this去调用)
const修饰成员函数:表示:该成员函数不会修改类对象的非静态数据成员
**** 对于类的成员函数而言, static和const是不能同时修饰类的成员函数的: 因为const函数隐含包含一个实例指针:const this * , 这与static相矛盾 ***********
2. 类的数据成员
static成员的作用类似于global变量,但要优于全局变量
2.1 static类成员变量,在类的内部叫 “声明”(static表示声明),在类的外部A::a=1; 叫赋值, 要定义必须加类型和赋值:int A::a=1; 这个才叫做定义
,这时不能加static,因为现在是定义而不是声明了
2.2 const类成员变量,只能在类的构造函数的初始化列表中初始化(只是对某个具体的对象而言,恒定不变)
2.3 要想在整个类中都建立恒定的常量,得使用: static const int a; = == == = =const static int a; (const, static 的位置不限), 它的定义跟2.1类似:
cpp文件中: const int A::a=1; (同样的,不要加static)
----;或者使用枚举常量:
- class Test
- {
- public:
- Test():a(0){}
- enum {size1=100,size2=200};
2.4 只有一类数据成员可以在类中初始化:静态整型成员常量(整型并不只有int,char等也是)
static const int a = 0; //Ok
static const char b = 0; //Ok
static const double c = 0; //Error
static const double d; //在类的定义(.h文件中)中声明一个变量
static const double d = 0; //在类的成员的定义中(.cpp文件中)定义在.h中声明的静态成员常量
还有一些规则可能因编译器不同而有所不同
static的五种含义
static的第一种含义:修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
static的第三种含义:修饰全局函数时,表明该函数只在同一文件中调用。 ==与extern相反
全局变量
全局变量是指文件中,定义在函数,类/结构外面的变量。目的是为了让多个函数和类都可以使用这个变量
分为:
普通全局变量,它的作用域是面向整个程序域的,面向项目中的所有文件的,在链接阶段,全局变量对所有的文件都是可见的:
注意它不需要加任何修饰符(默认的全局变量,就是面向整个程序域的);
staitic全局变量,它的作用域被限定在本文件中,只能为这个文件中的所以函数和类使用
exten的作用:
与C组合使用,extern C..., 表示c++项目按C语言的风格进行编译(包括参数的传递顺序,编译生成函数的名称...)
第二种是,“只是一个声明”,声明当前文件中使用的这个变量是一个外部变量,我不用去定义它,但是在其他的文件有定义,当前可以大胆的使用,
不能全都是extern,必须要有一个实际的文件中,进行这个变量的定义,否则在链接的时候,就不能实现当初的“承诺”而报错
http://www.cnblogs.com/johnpher/archive/2011/12/18/2570598.html
c++类定义代码的分离的更多相关文章
- cc4a-c++类定义与struct定义方式代码示范
cc4a-c++类定义与struct定义方式代码示范 #include <iostream> #include <string> using namespace std; st ...
- *使用配置类定义Codeigniter全局变量
之前提到的 CodeIgniter 引入自定义公共函数 这篇文章提到了公共函数实现,全局的变量也可以借助 helper 函数来实现.不过,更为合适的方式可能要属用配置类定义了. CodeIgniter ...
- c++类定义和类实现
预备知识: c++中我们cpp文件和.h文件的区别是,cpp文件是需要编译的文件,成为一个独立的编译单元,而h文件从来是不需要编译,只是用于预处理. 通常我们在cpp文件中,完成函数的实现,然后在h中 ...
- heredoc(实现模板与代码的分离)
heredoc(实现模板与代码的分离) 一.总结 heredoc实现模板与代码的分离,实现的是在后台编程语言中批量输出html代码,在这个批量输出的html代码中又可以嵌套编程语言变量.所以很方便. ...
- Js 类定义的几种方式
提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...
- WPF换肤之四:界面设计和代码设计分离
原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...
- 开涛spring3(12.4) - 零配置 之 12.4 基于Java类定义Bean配置元数据
12.4 基于Java类定义Bean配置元数据 12.4.1 概述 基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件. 基于Java ...
- python类定义
在我的收藏中有一篇特别详细的类讲解 此处部分内容引自:http://blog.sina.com.cn/s/blog_59b6af690101bfem.html class myclass: 'this ...
随机推荐
- 线性参照,M值的相关测试
怎样使用普通线要素获取带M值的线要素 怎样查看线要素各个折点上的M值,怎样导出为一张表 线性参照:http://resources.arcgis.com/zh-cn/help/main/10.2/in ...
- Python安装及运行中可能遇到的问题。
1.报错找不到Selenium. 解决办法: (1)可以调整工具中的以下两项 Setting: (2)Setting中设置此目录为Python安装目录,选择设置中的第一项后配置以下Python3.5的 ...
- 如何批量删除SQL注释?
如何批量删除SQL注释.. 这个,可能是用来干坏事的吧.不过有时候要做一些重构,也还是有用.嘿嘿 使用工具,notepad++,注意要选择正则表达式按钮才行. [1]删除 /* */ /\*{1, ...
- 001-GPG入门教程
对信息加密和解密.需要用到GnuPG软件(简称GPG),它是目前最流行.最好用的加密工具之一. 一.什么是GPG 要了解什么是GPG,就要先了解PGP. 1991年,程序员Phil Zimmerman ...
- CSS表格(未完成)
CSS 表格 使用 CSS 可以使 HTML 表格更美观. 表格边框 指定CSS表格边框,使用border属性. 下面的例子指定了一个表格的Th和TD元素的黑色边框:
- POJ2488:A Knight's Journey(dfs)
http://poj.org/problem?id=2488 Description Background The knight is getting bored of seeing the same ...
- 第22章 CLR寄宿和AppDomain
22.1 CLR寄宿 CLR Hosting(CLR 宿主)的概念:初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只 ...
- 从Maven仓库中导出jar包
从Maven仓库中导出jar包:进入工程pom.xml 所在的目录下,输入以下命令:mvn dependency:copy-dependencies -DoutputDirectory=lib更简单的 ...
- 第七章之main函数和启动例程
main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hell ...
- sql server中批量插入与更新两种解决方案分享(存储过程)
转自http://www.shangxueba.com/jingyan/1940447.html 1.游标方式 SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONG ...