一:C++中6个基本的类成员函数
构造函数特性:与类名称相同,可以重载(一个类可以有多个构造函数),用来在创建对象时初始化对象。
析构函数特性:~加类名称(~Mycode),一个类只有一个,当对象结束生命周期时,自动调用析构函数结束释放内存。
构造函数 | 默认构造函数 |
有参构造函数 | |
拷贝构造函数 | |
赋值构造函数 | |
析构函数 | |
const成员函数 | |
取地址成员函数和const取地址成员函数 |
- char* 是一个指向字符的指针,指向字符串存储在内存中的位置
- 构造函数的字符串参数应该是const char*类型,不应该修改传入的字符串
- 创建了一个public成员变量 char* cc和一个private成员变量 char*bb
- new关键字用于动态分配内存,并返回所分配内存的地址。
new char
用于在堆(heap)上动态分配一个char类型的内存空间,并返回一个指向这块内存的指针。
二:默认构造函数
类名称()
没有显示的提供初始化的构造函数,没有参数的构造函数。MYcode()
class MYcode {
public:
//--------------------------默认构造函数
MYcode() { cout<<"调用默认构造函数" << endl; };
char* cc;
private:
char* bb;
};
int main(){
MYcode str;//通过默认构造函数初始化对象(要是没有默认构造函数,这里会报错默认构造函数)
str.cc = new char[2]; // 分配内存给cc
strcpy_s(str.cc,2,"a");
cout << str.cc << endl;
return 0;
}
三:有参构造函数
类名称(参数1类型 参数1,参数2类型,参数2)
有参数的构造函数,可以在初始化对象时,直接传入参数,比如我们这里有两个参数char * cc,char *bb。MYcode(const char* c,const char* b)
class MYcode {
public:
//--------------------------有参数构造函数
MYcode(const char* c,const char* b) {//这里的const意思时传入的变量不可修改
cout << "调用有参数构造函数" << endl;
if (c!=nullptr) {//判断传入的c是否为空
cc = new char[strlen(c) + 1];//接收传入的字符串的长度+一个表示字符串结束的'\0'
strcpy_s(cc, strlen(c) + 1, c);
}
else {//如果传入的是空字符串,则开辟一个字节空间,存放'\0'
cc = new char[1];
*cc = '\0';
}
if (b != nullptr) {
bb = new char[strlen(b) + 1];
strcpy_s(bb, strlen(b) + 1, b);
}
else {
bb = new char[1];
*bb = '\0';
}
}
char* get_bb()const { return bb; }//返回私有成员变量bb
char* cc;
private:
char* bb;
};
int main(){
MYcode str1("hello", "today"); // 通过有参构造函数直接初始化对象
cout << str1.cc <<" "<<str1.get_bb() << endl;
return 0;
}
四:拷贝构造函数
类名称(const 类名称 & 对象名称)
可以通过一个对象初始化另一个对象 MYcode(const MYcode &p)
......
public:
MYcode(const MYcode &p) {//
cout<<"调用拷贝构造函数" << endl;
cc = new char[strlen(p.cc)+1];
strcpy_s(cc, strlen(p.cc) + 1, p.cc);
bb = new char[strlen(p.bb) + 1];
strcpy_s(bb, strlen(p.bb) + 1, p.bb);
}
......
int main(){
MYcode str2(str1);//通过拷贝构造函数用之前初始化的str1初始化str2
cout << str2.cc << endl;
return 0;
}
五:赋值构造函数
类名称 & operator=(const 类名称 & 对象名称)
可以通过一个对象初始化另一个对象,用”=“实现,MYcode& operator=(const MYcode& p),有返回值
...
public:
//-------------------------调用赋值构造函数
MYcode& operator=(const MYcode& p) {
cout << "调用赋值构造函数" << endl;
if (this == &p) // 检查自赋值
return *this;
if (cc != nullptr) {
delete[]cc;
}
cc = new char[strlen(p.cc) + 1];
strcpy_s(cc,strlen(p.cc)+1,p.cc);
delete[]bb;
bb = new char[strlen(p.bb) + 1];
strcpy_s(bb, strlen(p.bb) + 1, p.bb);
return *this;
}
char* get_bb()const { return bb; }//const成员函数,用来输出private成员变量bb;
...
MYcode str3 = str1;
cout << str3.cc <<" "<< str3.get_bb()<< endl;
...
六:析构函数
~ 类名称()
使用对象结束后,释放开辟的堆区内存,对象使用结束后自动调用~MYcode()
......
public:
//------------------------调用析构函数
~MYcode() {//析构函数
cout << "调用析构函数" << endl;
delete[]cc;
delete[]bb;
cc = nullptr;
bb = nullptr;
}
......
七:const成员函数
函数返回值类型 函数名称()const ( return 返回值);
用const修饰的成员函数,称为const成员函数,表明该成员函数不能对类的任何成员进行修改
......
char* get_bb()const { return bb; }//这是一个用来输出private成员变量的函数,在上面有参构造函数和赋值构造函数中用到
......
八:取地址成员函数和const取地址成员函数
详细解释可以参考这篇博客http://t.csdnimg.cn/9pkx9
用来获取对象的地址,普通取地址成员函数获取普通对象地址,const修饰的取地址成员函数获取const修饰的对象地址