C++封装(class,struct,public,protected,private,friend)

本文详细介绍了C++中的封装、类定义(包括class和struct)、构造函数与析构函数、拷贝构造/赋值运算符、大三法则、静态成员(变量和函数)以及友元(函数和类)。讲解了这些概念在实际编程中的应用场景和注意事项。

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

1 概述

  所谓封装,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。面向对象将万物都视为“对象”,任何对象都具有特性和行为。我们将其特性称为“成员变量”,将其行为称为“成员函数”,被封装的特性只能通过特定的行为去访问。

2 封装

  C++封装通过类(class)来实现。类定义可以使用关键字class和struct.

2.1 class or struct

  • class定义类默认成员变量是私有(private)的,可以定义公共(public)成员函数对其进行操作
  • struct 定义类默认成员变量是公有的。

例如:

#include <iostream>

class Class1
{
   
    int a; //a是私有的
public:
    int get_a() {
    return a; }
    bool set_a(int v)
    {
   
        if(v > MAX_A)
			return false;
		a = v;
		return true;
    }
    static int const MAX_A = 100;
};
struct Class2
{
   

    double get_b() const {
    return b; }
    float get_c() const {
    return c; }
    int a;//a是公有的
private:
    double b;//b是私有的
    float c;//c是私有的
};

int main(int argc, char *argv[])
{
   
    Class1 class1;
    Class2 class2;
    std::cout << "class1.a: " << class1.a << std::endl;//该行代码编译会出错
    std::cout << "class1.a: " << class1.get_a() << std::endl;
    std::cout << "class2.a: " << class2.a << std::endl;
    return 0;
}

编译结果:

test_001.cpp:16:25: error:int Class1::a’ is private within this context
   16 |     std::cout << class1.a << std::endl;
      |                         ^
test_001.cpp:5:9: note: declared private here
    5 |     int a; //a是私有的

注释出错代码

int main(int argc, char *argv[])
{
   
    Class1 class1;
    Class2 class2;
    //std::cout << "class1.a: " << class1.a << std::endl;//该行代码编译会出错
    std::cout << "class1.a: " << class1.get_a() << std::endl;
    std::cout << "class2.a: " << class2.a << std::endl;
    std::cout << "class2.b: " << class2.get_b() << std::endl;
    std::cout << "class2.c: " << class2.get_b() << std::endl;
}

运行结果:

class1.a: 32512
class2.a: -1067117848
class2.b: 6.89919e-310
class2.c: 0

结果分析:由于类的成员变量没有初始化,所以打印出的是随机数。C++类构造函数可以完成成员变量初始化。

2.2 构造/析构函数

  C++构造函数名称与类名相同,析构函数名是~+类名
为前面的类增加构造和析构函数:

class Class1
{
   
    int a; //a是私有的
public:
    Class1()
    : a(0)
    {
   
        std::cout << "Class1() is called" << std::endl;
    }
    Class1(int v)
    : a(v)
    {
   
        std::cout << "Class1(int) is called" << std::endl;
    }
    ~Class1()
    {
   
        std::cout << "~Class1() is called" << std::endl;
    }

    int get_a() {
    return a; }
};
struct Class2
{
   
    Class2()
    : a(1)
    , 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnow010

你的鼓励就是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值