当前位置: 首页 > news >正文

C++学习路线(二十三)

析构函数

在创建一个新的对象时,自动调用的函数,用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。

如果构造函数中没有申请资源(主要是内存资源)那么很少使用析构函数
函数名:
~类型
没有返回值,没有参数,最多只能有一个析构函数
访问权限:
一般都使用 public
使用方法:
不能主动调用。
对象销毁时,自动调用。如果不定义,编译器会自动生成一个析构函数(什么也不做)

this指针

类的静态成员函数不能使用this指针

#include <iostream>
using namespace std;class Human {
public:Human();Human(int age, int salary);int getAge() const;const Human* compare1(const Human* p);const Human& compare2(const Human&p) const;
private:int age = 28;int salary;char* addr;
};Human::Human(int age, int salary) {this->age = age;this->salary = salary;
}
int Human::getAge() const {return age;
}const Human* Human::compare1(const Human* p) {if (age > p->age) return this;else return p;
}const Human& Human::compare2(const Human& p) const {if (age > p.age) return *this;else return p;
}int main() {Human h1(25, 1800);Human h2(30, 2500);cout << h1.compare2(h2).getAge() << endl;return 0;
}

const 成员函数

需求分析:
const的Human对象,不能调用普通的成员函数。
分析:
C++认为,const(常量)对象,如果允许去调用普通的成员函数,而这个成员函数内部可能会修改这个对象的数据成员!而这讲导致const对象不再是const对象

类里面有两种const

一个是const对象 const Person per;

一个是const 方法 void func() const {}

C++的成员函数设置建议:
如果一个对象的成员函数,不会修改任何数据成员,那么就强烈:

把这个成员函数,定义为const成员函数!

const成员函数无法调用

可以看到const对象无法调用非const的成员函数

const 数据成员的初始化方式:
1.使用类内值(C++11 支持)
2.使用构造函数的初始化列表
(如果同时使用这两种方式,以初始化列表中的值为最终初始化结果)注意:不能在构造函数或其他成员函数内,对const成员赋值!

#include <iostream>class MyClass {
public:// 使用类内值初始化 (需要C++11支持)int const myConstValue1 = 5; // 构造函数MyClass(int value): myConstValue2(value),  // 使用构造函数的初始化列表myConstValue1(10) {    // 这里的myConstValue1会覆盖类定义内的初始化值// 注意: 不能在这里对const成员赋值// myConstValue1 = 20; // 这是错误的!}void printValues() const {std::cout << "myConstValue1: " << myConstValue1 << std::endl;std::cout << "myConstValue2: " << myConstValue2 << std::endl;}private:int const myConstValue1;int const myConstValue2;
};int main() {MyClass obj(20);obj.printValues();return 0;
}

类文件的分离

实际开发中,类的定义保存在头文件中,比如Human.h【类的声明文件】(C++PrimerPlus)类的成员函数的具体实现,保存在.cpp文件中,比如Human.cpp【类的方法文件】(C++PrimerPlus)
其他文件,如果需要使用这个类,就包含这个类的头文件。

Human.h

#pragma once
#include <iostream>
#include <string>class Human {
public:Human();int getCount();
private:std::string name = "John";int age = 28;static int count;
};

Human.cpp

#include "Human.h"int Human::count = 1;Human::Human() {std::cout << "构造函数" << std::endl;
}int Human::getCount() {return count;
}

对于非 const 的类静态成员,只能在类的实现文件中初始化。const 类静态成员,可以在类内设置初始值,也可以在类的实现文件中设置初始值。(但是不要同时在这两个地方初始化,只能初始化1次)

const静态成员变量

对于非const静态成员变量,必须在类外部定义和初始化。这是因为静态成员变量是在全局命名空间中存储的,而不是在类定义中。这意味着你不能在类声明中给出初始化值,只能在类外部给出。

对于const静态成员变量

有两种初始化方式:

  1. 在类内部初始化:可以直接在类声明中初始化。
  2. 在类外部初始化:可以在类外部初始化,但不能重复初始化

类内初始化

类外初始化


http://www.mrgr.cn/news/57873.html

相关文章:

  • js 基础补充3
  • C++——NetWork
  • 单细胞 | 转录因子足迹分析
  • 正则表达式 - 修饰符
  • 接口测试(六)jmeter——参数化(配置元件 --> 用户定义的变量)
  • Python | Leetcode Python题解之第494题目标和
  • EureKa是什么?
  • 揭秘.baxia:勒索病毒的隐秘与危害
  • MybatisPlus入门(二)MybatisPlus入门案例
  • 从0开始的数据结构复习 1
  • 电能表预付费系统-标准传输规范(STS)(20)
  • 三周精通FastAPI:10 Cookie 参数 和Cookie 参数模型
  • day-73 找出数组游戏的赢家
  • Java高级Day57-剩余内容补充
  • 编译方法及工具
  • 【无标题】Django转化为exe,app
  • 论文阅读与写作入门
  • java算法OJ(5)归并排序
  • 【机器学习】K-means聚类算法应用
  • [Python学习日记-54] 软件开发目录设计规范
  • 三大秘籍 HubSpot AI让你的业务如鱼得水
  • B/S架构的诊所云his源码,云门诊系统,支持二次开发,源码合作交付
  • 获取 Excel 文件中的所有工作表名称,可以通过 OleDbConnection 获取表架构
  • 关于bp抓不到本地包
  • riscv uboot 启动流程分析 - SPL启动流程
  • Cursor零基础小白教程系列「进阶」 - Cursor AI代码生成详解(Cmd+K)