析构函数
在创建一个新的对象时,自动调用的函数,用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。
如果构造函数中没有申请资源(主要是内存资源)那么很少使用析构函数。
函数名:
~类型
没有返回值,没有参数,最多只能有一个析构函数
访问权限:
一般都使用 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
静态成员变量
有两种初始化方式:
- 在类内部初始化:可以直接在类声明中初始化。
- 在类外部初始化:可以在类外部初始化,但不能重复初始化
类内初始化
类外初始化