类成员函数
就是定义与原型写在类里面的函数,能操作类的所有对象中的所有成员
class Box {
public:
double length; // 长度
double breadth; // 宽度
double height; // 高度
double getHeight(); //类中定义的所有成员函数都是内联的
double getVolume() {
return length * breadth * height;
}
};
也可以在类外部定义类成员函数,但得使用范围解析运算符 ::
double Box::getHeight() {
return height;
}
类访问修饰符
就是public、private、protected。
成员和类的默认访问修饰符是private。
- public成员(就不提了)
- private成员
类自己与友元函数才能访问。
class Box{
double width; //默认是private,类以外就无法访问了
public:
double length; //类内类外都可以通过成员变量+ . + length调用。
};
- protected成员
子类也能访问
class Box{
protected double width; //子类可以访问
};
class BoxSon : Box{ //不写就是private继承
public:
double getParentWidth(void); //声明
};
double BoxSon::getParentWidth(void) { //外部定义
return width; //父类的protected成员,在Box类是private
}
构造函数 & 析构函数
-
构造函数(无参 or 带参)
概念跟java里的差不多,不返回任何类型(包括void),一般用来初始化成员变量,可以在外部用Box::box( ...){...}定义。
使用初始化列表来初始化字段
Box::box( double wid, double hei ): height(hei), width(wid) {
...
}//注意,这里初始化顺序是按照声明顺序来的,即width=wid 先执行。(声明与初始化同步是个好习惯)
等价于:
Box::box( double wid ): {
width=wid;
height=hei;
...
}
-
析构函数
在属于当前类的对象被删除的时候执行,与构造函数同名,没有参数也不返回任何值。
一般用于在跳出程序(比如关闭文件,释放内存等)前释放资源。
class Line {
public:
void setLength( double len );
Line(); // 这是构造函数声明
~Line(); // 这是析构函数声明
};
-
拷贝构造函数(有点复杂后面再看)
三种场景会调用此函数:
- 用一个对象初始化同类型的另一个对象,拷贝此对象。Line line2 = line1
- 当对象作为参数被传递给函数时,拷贝此对象;func(Line line)
- 当一个函数返回的是某个对象时,拷贝此对象。func(){return line}
场景结束后,会析构掉拷贝出来的对象。
-
友元函数
定义在类外部(声明在内部),能访问类中private与protected成员(但它不是成员函数)。
友元类
友元类的所有成员都是另一个类的友元,只需要在这个类的定义中声明:
class A{
friend class B;
}
那么B能访问A的任何成员,但是反过来不行!!!
-
inline函数(内联)
很简单的小体积函数,编译时编译器会把函数体挪到调用它的地方,少了调用时间,增
加了空间成本。
-
this指针
this代表某对象的指针,例如:
Class B{
public:
int long;
int getLong(B b){
return this->long; //this代表调用getLong()方法的B对象的指针。
}
}
-
静态成员
1. 静态成员变量
在类的所有实例中只有一个副本,即实例们共享这一个变量,实例对此变量的修改会被同步。必须在类外用::定义(即分配内存,但是可以不初始化-即赋值);
int Box::objectCount = 0;//也可以不写 =0
2. 静态成员函数
只能访问静态成员 + 类外部其他函数。
类外通过::访问(类似于java)
Box::getCount();