每日学习记录02:(C++)构造函数,代理构造函数和析构函数
个人学习笔记,如有错误,请指正
构造函数
构造函数是一种特殊的成员函数,它在创建类的新对象时被调用,用于初始化对象的成员变量。构造函数的名称与类名完全相同,并且没有返回类型。构造函数可以重载版本。如果在类中没有显式定义构造函数,编译器会提供一个默认的无参构造函数。
#include <iostream>
#include <vector>
#include <string>
// 学生类
class Student {
private:
std::string name {"None"};
int id {0};
std::vector<int> scores;
public:
// 构造函数
Student(std::string n, int i);
// 构造函数的重载
Student(std::string n);
}
// 构造函数
Student:: Student(std::string n, int i) : name(n), id(i) {
std::cout << "已创建学生:"<< n << ",id为:"<< id <<std::endl;
}
// 代理构造函数
void Student::addScore(int score) {
this->scores.push_back(score);
}
int main(){
Student stu1{"luke",103};
return 0;
}
代理构造函数
代理构造函数是 C++11 引入的一个特性,它允许一个构造函数委托其部分或全部的初始化工作给同一个类中的另一个构造函数。
// 代理构造函数
void Student::addScore(int score) {
this->scores.push_back(score);
}
}
int main(){
Student stu1{"luke",103};
Student stu2{"murphy"};
return 0;
}
拷贝构造函数
用已有的类对象去赋值新的对象,将源对象的属性拷贝并复制给新的对象,至于这个拷贝是浅拷贝还是深拷贝,就看你的拷贝构造函数里面是怎末写的了。
// 拷贝构造函数:根据已存在对象的属性来更新新对象的属性(name,balance)
Student:: Student(const Student &source) : name {source.name}, id {source.id} {
}
}
int main(){
Student stu1{"luke",103};
Student stu2{"murphy"};
Student stu3{stu1};
return 0;
}
析构函数
析构函数是类的一种特殊成员函数,用于在对象生命周期结束时执行清理操作,如释放动态分配的内存、关闭文件等。析构函数的名称与类名相同,但前面加了波浪号(~)作为前缀。析构函数没有参数,也没有返回值。当对象超出作用域、被显式删除或程序结束时,析构函数会自动调用.
如果没有提供析构函数,编译器会自己提供一个默认的析构函数。建议自己写析构函数,因为编译器默认的是直接释放,如果当多个对象的某个指针成员共同指向了某一个地址,直接释放后,再次释放就会报错
完整代码
#include <iostream>
#include <vector>
#include <string>
// 学生类
class Student {
private:
std::string name {"None"};
int id {0};
std::vector<int> scores;
public:
// 构造函数
Student(std::string n, int i);
// 构造函数的重载
Student(std::string n);
// 添加成绩
void addScore(int score);
// 计算平均成绩
double calculateAverageScore();
// 获取学生姓名
std::string getName();
};
Student:: Student(std::string n) : Student(n,0){
}
Student:: Student(std::string n, int i) : name(n), id(i) {
std::cout << "已创建学生:"<< n << ",id为:"<< id <<std::endl;
}
// 拷贝构造函数:根据已存在对象的属性来更新新对象的属性(name,balance)
Student:: Student(const Student &source) : name {source.name}, id {source.id} {
}
void Student::addScore(int score) {
this->scores.push_back(score);
}
double Student::calculateAverageScore() {
int sum = 0;
for (int score : this->scores) {
sum += score;
}
return static_cast<double>(sum) / this->scores.size();
}
std::string Student::getName() {
return this->name;
}
int main(){
Student stu1{"luke",103};
Student stu2{"murphy"};
Student stu3{stu1};
return 0;
}