#include
#include
using namespace std;
struct Date
{
int y, m, d;
void setDate(int, int, int);
Date(int yy, int mm, int dd) {y = yy, m = mm, d = dd;}
};
class Student
{
private:
char* name;
Date birthday;
public:
// 如果没写不带参数的构造函数,系统会提供一个不带参数的构造函数,称为缺省构造函数,或者是拷贝构造函数
Student(const Student&); // 拷贝构造函数,当有new和delete的时候要写
Student():birthday(2000, 3, 4) {} // 不带参数的构造函数
Student(char*, int, int, int);
~Student() {delete []name;} // 与构造函数成对出现
};
Student::Student & operator = (const Student &s1) // 运算符重载函数
{
name = new char[strlen(s1.name) + 1];
strnpy(name, s1.name, strlen(s1.name));
birthday = s1.birthday;
return *this;
}
Student::Student(const Student &s1) // 拷贝构造函数
:birthday(s1.birthday) // 初始化
{
// name = s1.name; // 错误
name = new char[strlen(s1.name) + 1];
// name = s1.name; 错误,没用到新开辟的空间
strncpy(name, s1.name, strlen(s1.name));
}
:
birthday(y, m, d) // 初始化
{
// name = p; 不好,指针会改变
// name = new char\[sizeof§\]; // 指针的大小,一般为8个字节,但不是字符串的长度
name = new char\[strlen§ + 1\]; // 多一个位置存放'\\0'
strncpy(name, p, strlen§);
};
void print(Student s)
{
cout << s,name << endl; // error,私有的,不能访问
}
int main()
{
const char p = "zhangsan";
Student s1((char )p, 2000, 3, 4); // 强制类型转换
// Student *s;
// s = new Student[10000]; // 调用不带参数的构造函数10000次
Student s2(s1); // 调用拷贝构造函数
// print(s1); // 也会调用拷贝构造函数
Student s3;
s3 = s1; // 运算符重载
return 0;
}