C++基础——类与对象

本文详细介绍了C++中面向对象的封装概念,包括封装的意义、结构体与类的区别、成员属性的访问控制、构造函数(包括无参/有参、拷贝构造和析构函数)、对象创建与清理、深拷贝与浅拷贝、初始化列表以及静态成员的使用。

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

1 概述

C++是面向对象的语言,面向对象语言三大特性:封装、继承、多态。
C++将万事万物抽象为对象,对象上有其属性和行为。

2 封装

2.1 封装的意义

封装是面向对象的三大特性之一,封装将属性和行为作为一个整体,对属性和行为加以权限控制。
创建类语法:

class 类名 {
   
访问权限:
	属性;
	行为;
};

示例:

class Student {
   
private:
    string m_name;
    int m_age;
public:
    Student(string name, int age) {
   
        m_name = name;
        m_age = age;
    }
    string getName() {
   
        return m_name;
    }
};

上面除了定义属性和行为,也定义了权限访问控制符
C++包含三种访问控制符:

  • public 可被类中函数、子类函数、友元函数和类对象访问
  • protected 可被类中函数、子类函数、友元函数访问
  • private 可被类中函数和友元函数访问

2.2 struct和class区别

二者的区别在于默认的访问权限不同,struct默认访问权限为public,class默认访问权限为private

#include <iostream>
using namespace std;

class C1 {
   
    int m_A;
};

struct S1 {
   
    int m_A;
};


int main() {
   
    C1 c1;
    //c1.m_A; 报错,无法访问
    S1 s1;
    s1.m_A = 10;
    return 0;
}

2.3 成员属性设置为私有

通常,将成员属性设置为私有,并提供设置和获取的方法。
这样的好处是可以控制成员属性的访问权限,对于写权限,能够检测数据的有效性。

class Test {
   
public:
    //num1提供读写接口
    void setNum1(int num1) {
   
        m_num1 = num1;
    }

    int getNum1() {
   
        return m_num1;
    }

    //num2只提供读接口
    int getNum2() {
   
        return m_num2;
    }

    //num3只提供写接口,并判定数据范围
    void setNum3(int num3) {
   
        if (num3 > 0) {
   
            m_num3 = num3;
        } else {
   
            m_num3 = 0;
        }
    }

private:
    int m_num1;
    int m_num2;
    int m_num3;
};

封装的思想通常会将属性设置为私有,暴露必要的修改行为给外部。

3 对象创建和清理

3.1 构造函数和析构函数

一个类具有最基础的两个函数是构造函数和析构函数,即使程序员未添加这两个函数,编译器也会生成一个默认的版本。
其中构造函数用于为类创建一个对象,并进行一些初始化的工作。
析构函数与构造函数相反,是为了清理一个对象,并释放资源。
构造函数和析构函数都是由编译器自动调用。

class Test {
   
private:
	int m_num;
public:
    Test();
    Test(int num) {
   
		m_num = num;
	}

    ~Test();
};

构造函数可以重载,而析构函数只能有一个。构造函数可以通过传入不同的参数来重载,而析构函数没有参数。
当未定义构造函数和析构函数时,编译器会自动生成以下两个实现:

Test(){
   }
~Test(){
   }

默认会生成两个空实现。
而如果提供了有参构造函数,则编译器不会提供默认的空参构造函数,如果有此使用场景,则需要自己再提供一个空参构造函数。

3.2 构造函数分类及调用方式

构造函数有两种分类方式:
按参数分为:有参构造和无参构造
按类型分类:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐藏转换法

#include <iostream>

using namespace std;

class Person {
   
public:
    //无参构造函数
    Person() {
   
        cout << "无参构造函数" << endl;
    }

    //有参构造函数
    Person(int age) {
   
        cout << "有参构造函数" << endl;
        m_age = age;
    }

    //拷贝构造函数
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值