C++ 的一些概念(2)。
静态数据成员:就是说所有这个类的对象,都公用这个数据成员,你变了一个对象的静态成员的值,那么所有的都跟着变了。比如说:
class Clock{
int Hour, Minute;
static int Second; //定义了一个静态成员
}
// 函数中调用时:
Clock c1,c2,c3;
//这三个实体共用Second这个数据,变一个等于全变。
//直接调用时:
Clock::Second
静态函数成员:一般用来访问静态数据成员,就是说不用定义实体,也可以去访问它。而一般函数成员只能通过实体来访问。如果想要利用静态函数来访问非静态数据,就必须要通过参数,比较麻烦,也不推荐。
Class Clock{
public:
static int getSecond();//定义一个静态函数成员
private:
static int Second;
}
//调用时,可以直接访问:
Clock::getSecond();
友元函数:定义类的时候,我们是定义一种客观存在的物体,比如一个人,一辆车,但是有一些抽象的物体,比如亲戚关系等,它没有实体,并且很难形成一个类,友元函数就是为了定义这种关系而存在的。比如之前定义了表,但是不同时区有时差,要计算两个实体表中的时差,不能专门建立一个类去做这个事情,但是又需要去算,并且涉及到了俩个表呢,放在Clock的类里面又显得有点不伦不类,so,就在函数前面加一个friend 关键词,意思就是,这个函数定义在类外,用来表示类之间的关系。
Class Clock{
int Hour, Minute, Second;
public:
friend int timeLag(Clock &c1, Clock &c2);
//其他函数略了
}
//调用时,不需要应用实体:
Clock c1(1,1,1);
Clock c2(2,2,2);
int lag=timeLag(c1,c2);
友元类: 这个东西比较纠结,就是比如我在类B里面定义了一个友元类A,那么就是说类B是信任类A的,类A此时就嚣张了,可以访问类B的私有和保护成员。同时,作为我信任你的一点回馈吧(天啊这不是司马懿么3_3),类A的函数就都是类B的友元函数。(真纠结啊 = = )
要注意的三点:1.友元关系不能传递,可以这么表述:A=B B=C 但 A!=C . 2.友元关系是单向的。3. 友元关系不被继承。
Class B{
private:
....
friend class A;//此时类A是类B的友元类
....
}
常引用:函数的参数类型前面加个const,那么这个参数不能被更新,用了什么就是什么了。
常对象:对象名前面加个const,那么这个对象必须初始化,并且不可以被更新。
void display(const char &a){
cout<<a<<endl;
}
//引用时 只能给a赋一次值
int const pie=3.14;
pie=2; // nonono you can't
常成员函数:就是在函数声明后面,分号前面加个const,这个函数就成了常成员函数,它只能调用常成员函数,不可以更新类的数据成员。如果一个对象是常对象,那么这个对象只能调用它的常成员函数。同时,他可以用于重载区分,举个例子:
Class A{
private:
int a,b;
public:
void func();
void func() const; // 这就是常成员函数了
...//其他函数省略
}
// 写函数时,对于常成员函数要写明:
void A::func() const{ //const 不可少,否则就变成了第一个函数
.......
}
//调用时:
A test1(2,2);
const A test2(5,5);
test1.func(); //调用void func();
test2.func(); //调用void func() const;
常数据成员:如果一个数据成员前面加了const,那么任何函数不可以对这个成员赋值,只能通过构造函数初始化。
关于几个预编译中的关键字:
#include 这个谁都知道 一般分两个格式: <文件名> “文件名” 两者不同之处是:前者为标准搜索,文件在include子目录下;后者先在当前目录搜索,没有再按标准搜索,所以同一目录下,用双引号,外面的文件,用<>。
#define 定义符号常量 例如 #define PI 3.14,但是用const int PI=3.14会更好点。
#undef 删除#define定义的宏,这之后#define定义的宏就废了。
#if 等,条件编译指令,就是说达到某些条件时才参与编译。可以使编译在不同条件下产生不同目标代码,其实吧。。我觉得不大常用,调试的时候用用?反正作为一个普通的coder我没用过啊~