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. 在类外部初始化:可以在类外部初始化,但不能重复初始化

类内初始化

类外初始化

猜你喜欢

转载自blog.csdn.net/weixin_45169583/article/details/143216068