一、类的声明
1.不完全类
只声明而尚未定义的类称为不完全类
不完全类只能用于定义指针、引用、参数类型、返回值类型,不能定义对象
class Mat; Mat Test(Mat& B); Mat *pMat; Mat mt;
二、类的定义
1.常用关键字
(1)typedef:
类可以定义自己的局部类型的名字,局部类型名和原类型名可以混用
定义方法:typedef 原类型名 局部类型名
例:
class Mat { public : typedef int myType myType s[MAX][MAX]; Mat(myType a = MAX, myType b = MAX, myType type = 0); }; Mat::Mat(int a, int b, int type) :sizei(a),sizej(b){ memset(s, 0, sizeof (s)); }
(2)const:
const成员函数返回的引用,也是const
#include<iostream> using namespace std; class A { public : int x; void set( int x){ this ->x = x;} const A& Test1() const { x = 2; return * this ; } }; int main() { A a, b; b = a.Test1(); A &c = a.Test1(); a.set(2); b.set(2); a.Test1().set(2); return 0; }
(3)mutable:
mutable将数据声明为可变数据成员。可变数据成员永远不能成为const,即使它是const对象的成员
例:
class A { public : int x; mutable int y; A(int a, int b):x(a),y(b){} }; int main() { const A a(1,2); a.x = 3; a.y = 3; return 0; }
(4)friend:
(5)static:
2.类外定义的特殊要求
如果成员函数在类外定义,则:
(1)成员名必须有 类名:: 来限定
(2)形参表和成员函数可以不限定
(3)函数返回类型,如果使用的是类定义的类型,则需要使用完全限定名
例:
class A { public : typedef int myType; int x; myType y; int Test1( int a); myType Test2(myType a); }; int A::Test1( int a) { x = a; return x; } A::myType A::Test2(myType a) { y = a; return y; }
三、类的初始化
1.使用构造函数初始化
(1)在初始化列表中初始化与在构造函数的函数体中赋初值的区别
定义是指开辟空间,初始化是指给一个初值。
在初始化列表中初始化时,定义和初始化同时进行,因此初始化的顺序与初始化列表的顺序无关,只与声明成员的次序相同
在函数体上赋值时,已经定义好了,再赋值
例:
class A { int x; public : A(int i){x = i;cout<< "construct A " <<i<<endl;} ~A(){cout<<"delete A " <<x<<endl;} }; class B { A a; A b; A c; public : B():c(3),b(2),a(1){cout<<"construct B" <<endl;} ~B(){cout<<"delete B" <<endl;} }; int main() { B b; return 0; }
输出结果:
construct A 1
construct A 2
construct A 3
construct B
delete B
delete A 3
delete A 2
delete A 1
这里特意让初始化列表的顺序不同,可以看出构造与析构的顺序与初始化列表无关,只与声明顺序有关
(2)必须使用初始化列表的成员
有些成员必须构造函数初始化列表中初始化,不可以在构造函数的函数体中初始化,如const成员或引用类型的成员
例:
class A { int x; public : A(int i):x(i){} }; class B { public : int a; const int b; int &c; A d; B(int i) { a = i; b = i; c = i; d = i; } A(int i):a(i),b(i),c(i),d(i){} };
2.使用与初始化数组元素相同的方法初始化
对于没有定义构造函数并且全体数据成员均为public的类,可以采用与初始化数组元素相同的方式初始化成员,但这种方法不提倡
例:
class A { public : int a; char *b; }; int main() { A a = {1, "a+b" }; return 0; }