[C++]类总结

本文深入探讨C++中类的基础知识,包括类的声明与定义、成员函数、构造与析构函数、const成员函数、this指针、静态成员变量与函数等核心概念,为初学者提供了全面的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.类基础


1.1.类的声明

一般的习惯是,类的声明和定义分别在头文件和源文件中进行,声明一个类时,使用关键字class,语法如下:

//Person.h
#include <string>
class Person {
    
    private:
        int age;
        std::string name;
    public:
        std::string getName();
        void setName(std::string str);
};

1.2.类的定义

在源文件中定义类时,首先引入类声明的头文件,然后使用作用域解析符::来标记类的方法,如:

//Person.cpp

#include "Person.h"

std::string Person::getName() {
    return name;
}

void Person::setName(std::string str) {
    name = str;
}

在main文件中使用这个类时:

//cls1.cpp

#include <iostream>
#include "Person.h"

int main()
{
        using namespace std;
        Person p;
        p.setName("zhangsan");
        cout << p.getName() << endl;
        return 0;
}

1.3.访问修饰符

在类声明时看到了publicprivate修饰符,C++中有三种访问修饰符:

  • public:该类对象都可以访问;
  • private:只有通过公有成员函数才可以访问;
  • protected:子类和该类对象可以访问;

通常,属性使用private修饰,而成员函数被public修饰,默认为private

1.4.成员函数

  • 1.定义成员函数时,使用作用域解析符::标记函数所属的类;
  • 2.类方法可以访问类的private组件;
  • 3.在类声名中定义的成员函数,将自动成为内联函数,因此,类声明中一般将于短小的函数作为内联函数。
  • 4.可以通过关键字inline在类定义时定义该成员函数为内联。

2.构造函数

构造函数不是用来让对象调用的,而是用来创建类的对象的,每次创建类的对象,都会调用构造函数。

2.1.声明和定义构造函数

构造函数的名称和类相同,如对于Person类,我们可以定义如下的构造方法:

//Person.h

#include <string>
class Person {
    public:
        Person(std::string name, int age);
};
//Person.cpp
Person::Person(std::string name, int age) {
    m_name = name;
    m_age = age;
}

通过函数的重载,可以定义多个特征标不同的构造函数。

2.2.使用构造函数

当定义好构造方法后,根据构造方法来创建对象:

Person p1("zhangsan",12);

第二种方式如下:

Person p1 = Person("zhangsan",12);

第三种方式是通过new来创建一个匿名对象,并返回该对象的地址:

Person *p = new Person("zhangsan",12);

第四种方式,在c++11中,可通过列表初始化,但必须提供和某个构造函数的参数列表一致的内容,如:

Person p1 = {"zhangsan",23};

2.3.默认构造函数

如果不显式提供构造函数,则编译器会提供默认构造函数。

通常的做法是应提供对所有类成员做初始化的默认构造函数。

3.析构函数

当类的对象销毁时,程序将自动调用该类的析构函数。

3.1.作用

用来完成清理工作。

3.2.声明和定义析构函数

析构函数在类名前加上~表示,且不带有任何参数,如下所示:

//Person.h

#include <string>
class Person {
    public:
        ~Person();
};
//Person.cpp
Person::~Person() {
    //......
}

3.3.使用析构函数

和构造函数一样,析构函数由编译器调用,不能使用类的对象去调用析构函数,那么它什么时候被调用呢?

  • 1.如果创建的是静态存储类对象,则其析构函数在程序结束后自动被调用;
  • 2.如果创建的是自动存储类对象,则其析构函数在程序执行完对应代码块时被调用;
  • 3.如果对象通过new创建,则只有在delete时,才会调用析构函数。

如果没有显式地定义析构函数,则编译器将提供一个默认析构函数。

4.const成员函数

使用const修饰成员函数,可以保证函数不会修改调用对象,称为const成员函数,声明和定义时将const放在函数括号的后面:

std::string getName() const;

std::string Person::getName() const {
    //......
}

5.this指针

对于每个成员函数,都存在一个this指针,它指向用来调用成员函数的对象。

因此,如果成员函数需要引用这个调用对象,则可以使用*this

const成员函数将this限定为const,因此将不能通过this指针来修改调用对象的值。

6.静态成员变量

类中使用static限定的成员变量为静态成员变量,静态类成员变量有一个特点:不管创建多少对象,只创建一个静态变量的副本,因此,同一个类的所有对象都使用同一个静态变量。
同时需要注意:不能在类声明中初始化静态成员变量,因为声明仅仅描述如何为类分配内存,但并不会分配内存。

7.静态成员函数

将成员函数使用static限定,则该成员函数为静态成员函数,静态成员函数将不和特定的对象关联,只和该类有关。注意事项总结有以下几点:

  • 1.静态成员函数不能通过对象来调用;
  • 2.由于1,静态成员函数中不能使用this指针;
  • 3.由于1,因此只能使用静态数据成员;

关于静态方法的调用,如果是public的静态成员函数,则可以在外部使用类名加作用域解析符进行调用,如:

static void show();
MyClass::show();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值