1.类的声明
声明类,可以使用关键字class,在它后面依次包含类名,一组放在{ }内的成员属性和方法以及结尾的分号
类声明类似与函数声明,将类本身及其属性告诉编译器,类声明本身不改变程序的行为,除非使用它,就像需要调用函数一样
类声明如下:
1 class Circle 2 { 3 private: 4 const double Pi; 5 double Radius; 6 7 public: 8 Circle(double Input):Radius(Input),Pi(3.1416){} 9 10 double GetCircule() 11 { 12 return 2*Pi*Radius; 13 } 14 15 double GetArea() 16 { 17 return Pi*Radius*Radius; 18 } 19 }; 20 21 class MyString 22 { 23 private: //声明属性为私有 24 char *Buffer; 25 bool Stringvolit; 26 27 public: //声明公有属性 28 MyString(const char * Input) //构造函数 29 { 30 if(Input != NULL) 31 { 32 Buffer = new char[strlen(Input) + 1]; 33 strcpy(Buffer,Input); 34 } 35 else 36 { 37 Buffer=NULL; 38 } 39 } 40 MyString(const MyString& CopySource) //复制构造函数 41 { 42 if(CopySource.Buffer != NULL) 43 { 44 Buffer = new char[strlen(CopySource.Buffer)+1]; 45 strcpy(Buffer,CopySource.Buffer); 46 } 47 else 48 { 49 Buffer=NULL; 50 } 51 } 52 ~MyString() //析构函数 53 { 54 cout<<"Invoking destructor,clean up"<<endl; 55 if(Buffer != NULL) 56 { 57 delete[] Buffer; 58 } 59 60 } 61 62 int GetLength() 63 { 64 return strlen(Buffer); 65 } 66 67 const char* GetString() 68 { 69 return Buffer; 70 } 71 72 };
2.实例化对象
如上例中,声明类一个Mytring类,我们如果需要使用这个类,就要根据类实例化一个对象,并通过对象访问成员方法和属性
实例化类对象和创建其他类型(如int)类型相似:
int i=0;
MyString SayHello;
也可以动态分配内存的方式,也可使用new为Mytring对象分配内存
int *p = new int;
MyString *SayHello = new MyString;
3.类对象成员的访问方式
使用句点运算符访问成员
MyString SayHello;
SayHello.Stringvolit=true;
使用指针运算符(->)访问方式
Mytring *Sayhello = new MyString;
SayHello->Stringvolit=true;
4.关键字public和private
我们在类声明中把类属性声明为公有和私有(另外还有一个peotected属性),声明为public公有意味着有了对象后就可以获取他们,声明为私有则意味着只能在类的内部(或其友元)中访问
5.构造函数与析构函数
构造函数与析够函数是一种特殊的函数(方法)。构造函数在创建对象时使用,构造函数可以重载;析构函数是在对象被销毁时自动调用,每个类只能右一个析构函数,析构函数不能被重载。
构造函数可以用来对对象成员变量进行初始化等,析构函数常被用来重置对象成员变量和释放动态分配的内存和其他资源
我们声明类时,如果没有声明构造函数和析构函数,编译器会自动帮我们声明默认的构造函数和析够函数,不过他们什么都没干,如下所示:
1 MyString() //默认构造函数 2 { 3 } 4 ~MyString() //默认析构函数 5 { 6 }
6.复制构造函数是用来当对象被复制(如将对象按值传递给函数时),编译器将调用复制构造函数,用来确保对缓冲区进行深复制,防止按值传递时在释放对象时造成内存错误