文章内容
①重点记录(首先记录):构造函数,析构函数。
②辅助记录(最后记录):字符串和字符数组“赋值”给另一个字符数组的方法和出现“严重性 禁止显示状态”问题的解决,以及变量与父类重名的问题。
构造函数定义:
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
构造函数的名称与类的名称相同。
构造函数没有返回值类型,同时分为无参构造和有参构造。
构造函数通常用于为成员变量设置初始值。
格式:
无参构造: 类名();
有参构造: 类名(参数类型);
注意:
创建类的对象时,系统会默认执行构造函数。
若类中未定义构造函数时,系统会默认创建并执行无参构造函数;
若存在无参构造函数时,则会在创建类的对象时自动执行;
若存在一个有参构造函数时,则会在创建类的对象时要求进行赋值并调用有参构造函数;
若存在多个有参构造函数时,则会根据参数类型和位数进行选择调用对应的有参构造函数。
析构函数定义:
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。
析构函数的名称与类的名称相同,只是在前面加了个波浪号(~)作为前缀。
析构函数没有返回值类型,也不能带有任何参数。
析构函数通常用于在跳出程序前释放资源。
格式:
~类名();
注意:
类的对象生命周期结束后,系统会自动执行析构函数。
举个例子:
编写Book类,类中有字符数组字段,表示图书名字、图书作者、图书书号、出版社,有一个浮点型字段表示数的单价,使用构造函数初始化所有字段,并打印对象所有数据。
class Book {
public:
char bookName[10], bookAuthor[10], bookSno[5], bookPress[20];//定义字符数组
float money;
Book(char[], char[], char[], char[], float);//定义含参构造函数
void print();//定义打印方法
~Book();//定义析构函数
};
//为构造函数赋值
Book::Book(char name[], char author[], char sno[], char press[], float money) {
strcpy(bookName,name);//字符数组不可以直接赋值给另一个字符数组,要用strcpy函数将右边的字符串或字符数组复制给左边的字符数组。
strcpy(bookAuthor, author);
strcpy(bookSno, sno);
strcpy(bookPress,press);
this->money=money;//变量与父类重名时使用this调用父类的变量,注意this→变量名不是this.变量名
}
void Book::print() {
cout <<"书名:" << bookName << "\n作者:" << bookAuthor << "\n书号:"<<bookSno<<"\n出版社:"<<bookPress<<"\n价格:"<<money;
}
Book::~Book() {
cout << "\n执行完毕!";
}
int main()
{
char name[] = "C++", author[] = "摸鱼", sno[] = "1234", press[] = "摸鱼王";
Book book(name, author, sno, press, 20.21);
book.print();
}
执行结果:
补充:
1.字符串和字符数组赋值给另一个字符数组的方法。
首先纠正赋值的说法,准确说应该为复制,这里使用strcpy()方法;
规则:
strcpy(left,right);
left为要复制给的字符数组名字,right可为即将要复制的字符数组或字符串。
注意:
①:strcpy函数是将右边的字符串或数组复制给右边字符数组,而赋值语句只能将一个字符赋给一个字符变量或者字符数组元素。因此不能用“=”进行赋值。
②:可能会出现的“严重性 禁止显示状态”的异常问题导致程序无法正常运行,这是由于strcpy()方法被微软认为是不安全的,解决方法是在程序头文件部分写入 #pragma warning(disable:4996),或将strcpy改为strcpy_s,即可解决。
2.变量与父类重名
变量与父类重名时可以使用this调用父类的变量,注意是this→变量名不是this.变量名。