C++类
发表于:2024-12-08 | 分类: C++
字数统计: 1k | 阅读时长: 4分钟 | 阅读量:

类,析构、构造、this

定义

  • 类是一种数据类型,对象是它的实例(Instance)
  • 类成员
    • 属性(成员变量)
    • 行为(成员方法)
    • 访问修饰符
    • 构造函数
    • 析构函数
    • 静态成员(类共享)
    • 友元函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class ClassName {
private:
// 私有成员变量和函数
int privateVar;

void privateMethod();

protected:
// 受保护成员
int protectedVar;

public:
// 公有成员变量和函数
int publicVar;

void publicMethod();

// 构造函数
ClassName();

// 析构函数
~ClassName();

// 静态成员
static int staticVar;

static void staticMethod();
};
  • 成员变量 : 描述类的属性
  • 成员函数:操作类成员变量的函数
  • 构造函数: 对象初始化,创建对象时自动调用
  • 析构函数: 清理对象资源,销毁时自动调用

访问控制符

  • 修饰类的成员
  • 不加修饰符,默认是private
  • 可以写多个相同的修饰符
访问控制符 类内部成员是否可访问 派生类成员是否可访问 类外部是否可访问 适用范围
private 默认类成员访问控制符
protected 通常用于继承
public 用于接口、外部访问

this关键字

  • 是一个常量指针(是个常量指针常量,始终指向当前对象,指向和指向上的值都不能修改)
  • 可通过->访问当前类的成员
  • 当类成员与形参重名时,不可省略this
  • this只能在类的成员函数中使用

构造函数

  • ClassName(var...)名字与相同的函数
  • 无类型、无返回值、可以有多个(无参,有参)
  • 创建对象时自动执行,一般用于类成员变量初始化
  • 没有构造函数时,会自动创建一个无参构造。
  • 无参构造的括号可有可无(就像函数指针的&可有可无,推荐不要)

析构函数

  • 格式~ClassName()
  • 只有一个,前面有~,无参数
  • 不创建析构函数,编译器会自动创建
  • 创建的普通对象,对象销毁时(函数执行结束)自动调用析构函数
  • new创建的对象,需要手动使用delete调用析构函数

综合案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef STUDENT_H
#define STUDENT_H

class Student
{
public:
// 无参构造
Student();

// 全参构造
Student(char *name, int age);

// 析构函数
~Student();

// 成员函数,只是打印,不修改成员变量,使用const修饰(不用也行)
void show() const;

// 获取年龄
int getAge();

private:
char *name;
int age;
};

#endif
  • 注意定义时使用::说明成员归属
  • 在成员内部可以直接访问任意权限的成员【成员方法,成员函数】,或者使用this
  • 析构函数中一般做销毁操作,与new搭配,这里我们给name动态分配了,所以销毁它,否则不用操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "student.h"
#include <iostream>
#include <string.h>
using namespace std;

// 使用类名::标记函数归属
Student::Student()
{
// TODO
}
Student::Student(char *name, int age)
{
// 这里this不能省略,因为构造函数的参数和成员变量重名了
// 动态分配内存,strlen(name) + 1
this->name = new char[strlen(name) + 1];
strcpy(this->name, name);
this->age = age;
}

Student::~Student()
{
cout << "析构函数执行了" << endl;
// 下方和delete name;效果一样
delete[] name;
name = NULL;
}

void Student::show() const
{
// 这里不使用this->name也可以,类内部是可以直接访问成员变量的
cout << "name" << this->name << endl;
cout << "age" << age << endl;
}

int Student::getAge()
{
return this->age;
}
  • 第一次:stu1普通对象销毁,系统自动调用析构函数
  • 第二次:stu2指针对象动态分配,需要手动delete str2,会自动触发析构函数
  • 销毁时机函数执行结束
  • 动态分配的对象,不delete str2,不会触发析构,也有内存泄漏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <student.h>
using namespace std;

int main()
{
// 使用全参构造创建普通对象
Student stu1("Tom", 18);

// 使用set函数修改对象
stu1.getAge();
stu1.show();

// 创建指针对象
Student *stu2 = new Student("Alice", 19);

// 修改指针对象
stu2->show();

// 释放内存
delete stu2;
stu2 = NULL;

return 0;
}
上一篇:
C++类的static
下一篇:
C++数据类型补充