每日学习记录02:(C++)构造函数,代理构造函数和析构函数

devtools/2024/11/19 22:25:23/

每日学习记录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;
}

http://www.ppmy.cn/devtools/135312.html

相关文章

AC自动机探究(一)

1.初识AC自动机 1.1什么是AC自动机 可以简单将AC自动机理解为字典树的加强版本&#xff0c;使用AC自动机可以存储敏感词数据&#xff0c;去使用AC自动机筛选出大文本中是否有敏感词数据。 所以使用AC自动机可以简单&#xff0c;快速的根据AC自动机寻找到文本中的敏感词数据&am…

Python学习27天

字典 dict{one:1,two:2,three:3} # 遍历1&#xff1a; # 先取出Key for key in dict:# 取出Key对应的valueprint(f"key:{key}---value:{dict[key]}")#遍历2&#xff0c;依次取出value for value in dict.values():print(value)# 遍历3&#xff1a;依次取出key,value …

springboot整合elasticsearch,并使用docker desktop运行elasticsearch镜像容器遇到的问题。

springboot和elasticsearch版本兼容性问题&#xff1a; 使用easy-es组件&#xff0c;简化es的操作&#xff0c; ​ Easy-Es​官网&#xff1a;https://www.easy-es.cn/ 参考easy-es组件官网的文档的内容&#xff0c;调整版本问题。 ​​​​ Java代码如下&#xff1a; packa…

校园二手交易网站毕业设计基于SpringBootSSM框架

目录 一、引言 二、需求分析 2.1用户需求分析 2.1.1学生用户 2.1.2管理员 2.2系统功能需求 2.3系统非功能需求 ‌2.4技术需求 ‌2.4.1 技术选择 ‌2.4.2系统架构‌ 三、详细设计 3.1系统架构设计‌ ‌3.2前端设计‌ ‌3.3后端设计‌ ‌3.4数据库设计‌ 本文介绍…

使用useCallback引发对闭包的理解

一、先简单介绍一下闭包: 闭包是 JavaScript 中的重要概念&#xff0c;它指的是一个函数可以“记住”并访问其词法作用域&#xff0c;即使在这个函数的外部被执行。简单来说&#xff0c;闭包是由函数及其相关的环境组合而成的。 闭包的特性 函数内部可以访问外部变量: 闭包…

【全栈环境搭建】Fantasy和ZMFrameWork整合

1.环境搭建 一、Fantasy框架下载1.https://github.com/qq362946/Fantasy.git2.修改 Fantasy/examples/Server/Main/NLog.config 配置打印日志文件:<?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schem…

uni-app快速入门(六)--rpx尺寸单位与Flex布局

一、uni-app尺寸单位 uni-app支持的通用尺寸单位包括px、rpx。为支持跨平台&#xff0c;在搭建空驾驶建议使用Flex布局。px指屏幕像素&#xff0c;rpx是响应式像素&#xff0c;是根据屏幕宽度自适应的动态单位。假如屏幕宽度为750像素&#xff0c;750rpx正好为屏幕宽度。uni-ap…

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…