首页 > 编程语言 >c++的类和对象(1)

c++的类和对象(1)

时间:2024-11-24 20:31:05浏览次数:14  
标签:函数 访问 对象 成员 c++ int 指针 变量

1.类的引入

类的引入是面向对象编程(OOP)中的一个基本概念,它代表了面向对象编程范式的核心。在C++中,类(Class)是一种用户定义的数据类型,它将数据表示(属性)和操作数据的方法(函数)组合成一个单一的实体。 

class ClassName {
    // 类的成员变量(属性)
    // 类的成员函数(方法)
public:
    // 公有成员(可以被类外部访问)
protected:
    // 保护成员(可以被类自身、派生类以及友元函数访问)
private:
    // 私有成员(只能被类自身访问)
};

 

类的引入目的

  • 模块化:类允许程序员将复杂的系统分解成更小、更易于管理的模块。
  • 代码复用:通过继承机制,类可以继承其他类的特性,减少代码重复。
  • 易于维护:由于类封装了数据和操作,因此更改类的内部实现不会影响到其他部分的代码。
  • 增强安全性:通过访问控制,类可以保护其数据不被不恰当的访问和修改。


2.类的定义

类定义的组成部分

  1. 访问修饰符

    • public:公有成员可以被类的外部访问。
    • protected:保护成员可以被类自身、派生类以及友元函数访问。
    • private:私有成员只能被类自身访问。
  2. 成员变量:类中定义的数据。

  3. 成员函数:类中定义的操作数据的函数。

  4. 构造函数:用于初始化类的对象。

  5. 析构函数:用于在对象生命周期结束时执行清理工作。

类定义的示例

#include <string>

class Person {
private:
    // 私有成员变量
    std::string name;
    int age;

public:
    // 构造函数
    Person(std::string n, int a) : name(n), age(a) {}

    // 成员函数,设置姓名
    void setName(std::string n) {
        name = n;
    }

    // 成员函数,获取姓名
    std::string getName() const {
        return name;
    }

    // 成员函数,设置年龄
    void setAge(int a) {
        age = a;
    }

    // 成员函数,获取年龄
    int getAge() const {
        return age;
    }

    // 成员函数,显示个人信息
    void display() const {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};


3.类的封装

封装

封装是一种将数据和操作数据的函数捆绑在一起的方法,以防止外部直接访问类的内部工作细节。封装的目的包括:

  • 隐藏实现细节:用户不需要知道类的内部工作方式,只需要知道如何使用它。
  • 保护数据:防止外部直接修改类的内部状态,确保数据的一致性和完整性。
  • 模块化:通过封装,类的内部实现可以独立于其他类的实现进行更改,而不会影响使用该类的代码。
class BankAccount {
private:
    // 私有成员变量,只能被类内部访问
    double balance;

public:
    // 构造函数,初始化账户余额
    BankAccount(double initialBalance) : balance(initialBalance) {}

    // 公有成员函数,用于存钱
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    // 公有成员函数,用于取钱
    bool withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount;
            return true;
        } else {
            return false;
        }
    }

    // 公有成员函数,获取账户余额
    double getBalance() const {
        return balance;
    }
};

int main() {
    BankAccount account(1000.0); // 创建账户,初始余额为1000

    account.deposit(500.0); // 存入500
    account.withdraw(200.0); // 取出200

    // 尝试直接访问私有成员变量(错误,编译器将报错)
    // account.balance = 0; 

    std::cout << "Current balance: " << account.getBalance() << std::endl; // 正确地获取余额

    return 0;
}

4.类的作用域

在C++中,类定义了一个新的作用域,这意味着在类内部声明的名称(如成员变量和成员函数)在类的外部是不可见的,除非通过类的成员访问运算符(.)或者指针/引用的箭头运算符(->)来访问。以下是关于类作用域的一些关键点:

类作用域的特点:

  1. 成员变量和成员函数

    • 在类内部声明的成员变量和成员函数属于类的作用域。
    • 成员变量和成员函数默认是私有的,除非明确指定为publicprotected
  2. 名称隐藏

    • 类内部的名称会隐藏外部的同名名称。如果在类内部声明了一个与外部同名的变量或函数,那么在类的作用域内,这个内部名称会覆盖外部名称。
  3. 作用域解析运算符

    • 如果需要在类外部访问类的成员,需要使用作用域解析运算符::
  4. 构造函数和析构函数

    • 构造函数和析构函数也属于类的作用域,它们在创建和销毁类的对象时被调用。
class MyClass {
public:
    int publicVar; // 公有成员变量
    void publicFunc() { // 公有成员函数
        // 在这里可以访问类的所有成员
    }

private:
    int privateVar; // 私有成员变量
    void privateFunc() { // 私有成员函数
        // 在这里可以访问类的所有成员
    }

    // 构造函数
    MyClass() {
        privateVar = 0;
    }
};

int main() {
    MyClass obj;

    // 访问公有成员
    obj.publicVar = 10; // 正确
    obj.publicFunc();   // 正确

    // 尝试访问私有成员(错误,编译器将报错)
    // obj.privateVar = 20; // 错误
    // obj.privateFunc();   // 错误

    return 0;
}

 

类的对象大小的计算

在C++中,类对象的大小取决于其成员变量的大小、对齐要求以及可能的填充(padding)字节。以下是计算类对象大小的几个关键点:

  1. 成员变量:类对象的大小至少是其所有非静态成员变量大小的总和。

  2. 成员对齐:每个成员变量可能有其特定的对齐要求。对象的内存布局会按照这些对齐要求来调整。

  3. 类对齐:整个类对象可能也有一个对齐要求,这会影响对象的总大小。

  4. 填充字节:编译器可能会在成员变量之间插入填充字节以满足对齐要求。

 

class MyClass {
    int a;       // 通常占用4字节
    char b;      // 占用1字节
    double c;    // 通常占用8字节
    // 可能的填充字节
};
// 假设默认对齐数为8
// 计算过程:
// a占用4字节,b占用1字节,但由于double需要对齐到8字节,所以b之后会有3字节的填充
// c占用8字节
// 因此,MyClass对象的总大小为:4 + 1 + 3(填充) + 8 = 16字节

类成员函数的this指针

在C++中,每个非静态成员函数都有一个隐含的参数,称为this指针。this指针指向调用该成员函数的对象本身。以下是关于this指针的一些关键点:

  1. 隐含参数this指针是隐含传递给成员函数的第一个参数。

  2. 类型this指针的类型是类类型的指针,例如MyClass*

  3. 用途this指针用于访问调用该函数的对象的成员变量和成员函数。

  4. 非静态成员函数:只有非静态成员函数才有this指针。

  5. 默认值:在成员函数内部,可以显式地使用this指针,也可以省略它,因为编译器会自动添加。

class MyClass {
public:
    int value;

    void setValue(int val) {
        this->value = val; // 使用this指针显式地设置成员变量
    }

    int getValue() const {
        return this->value; // 使用this指针显式地获取成员变量
    }
};

MyClass obj;
obj.setValue(10); // 调用时,编译器会隐含传递this指针
int val = obj.getValue(); // 同样,编译器会隐含传递this指针

标签:函数,访问,对象,成员,c++,int,指针,变量
From: https://blog.csdn.net/z6665454/article/details/144011464

相关文章

  • console.log打印对象的坑...
    问题:console.log()打印一个对象|数组时,在控制台看到的是打印的最终状态,而不是打印时的状态(不是执行console.log()的那一刻)。解决:要打印对象|数组时,最好JSON.stringify()打印,或者打印里面具体的值,而不是打印整个对象。constobj={}setTimeout(()=>{console.log('给......
  • Python面向对象
    一、面向对象面向对象是当前最流行的一种软件设计模式,但是并不意味着一切都是面向对象,很多开发者还保留者面向过程或者说是面向函数编程的习惯。面向对象的出现,可以很好的实现代码结构化的管理。使用面向对象的编程开发,可以有效的实现代码的可重用性设计。面向对象,更多的是要......
  • 类和对象(继承、接口)
    类是一个抽象的概念,它定义了一组具有相同属性和行为的对象。类本身并不占用从内存空间,只有在创建对象才会实例化。对象是类的具体实例,是一个实实在在的东西。对象具有状态和行为。同过数据值描述转台,通过操作改变状态。面向对象的编程语言面向对象编程的四项基本原则是:1.抽......
  • 【JavaScript】关于对象解构赋值
    概念对象解构赋值是JavaScript中的一种语法特性,它提供了一种简洁的方式来从对象中提取属性值,并将这些值赋给变量。这种方式使得代码在处理对象数据时更加直观和高效,避免了传统的通过对象属性访问(如object.property)来逐个获取和赋值的繁琐过程。对象就像是一个装满各种......
  • KTL 一个支持C++14写公式的K线工具 - 0.9.2版,通达信mdt全景数据复盘大盘,Qt自定义图表
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL    国内仓库:https://gitee.com/bbqz007/KTL 当前0.9.2新添加功能基于QCharts跟通达信mdt数据文件。使用者能够使用QCharts自定义数据处理图表。......
  • C++象棋代码 (控制台版)
    C++象棋代码 在win7写的 如果有疑问可以在评论区问有bug也可以在评论区反馈我会不定期修复的下面上代码:#include <windows.h>#include <string>#include <iostream>#include <cmath>using namespace std;int main(){    void Chinese_chees_Int_H......
  • 【最新原创毕设】基于SpringBoot的图书管理系统+13714(免费领源码)可做计算机毕业设计JA
    目 录摘要1绪论1.1研究背景与意义1.2开发现状1.3论文结构与章节安排2 图书管理系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析......
  • 最新毕设-SpringBoot-高校科研成果管理系统-58574(免费领项目)可做计算机毕业设计JAVA、
    摘要随着科研规模和复杂度的增加,管理科研成果、经费申请等方面变得愈发困难,需要系统化的管理工具进行支持。并且科研活动产生的数据量庞大,也越来越来越多的成果涌现,需要有效的数据管理系统来对高校科研成果进行处理、审核和发布。科研成果还是高校评价学者和教师绩效的重要依......
  • (2024最新毕设合集)基于SpringBoot的校园共享厨房信息系统-72647|可做计算机毕业设计JAV
    目 录摘要第一章 绪论1.1选题背景与意义1.2研究现状1.3论文结构与章节安排第二章系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分......
  • CSS的伪类和伪对象有什么不同?
    CSS伪类和伪元素之间的主要区别在于它们选择的内容以及如何使用它们。伪类选择现有元素的特定状态,而伪元素创建新的抽象元素,这些元素不是文档树的一部分。更详细的区分:伪类(Pseudo-classes)选择什么:选择处于特定状态的现有元素。例如,链接的悬停状态、表单元素的焦点状态......