首页 > 编程语言 >C++类和对象

C++类和对象

时间:2024-08-05 18:55:13浏览次数:17  
标签:函数 对象 成员 C++ 注意事项 MyClass public

文章目录

C++类和对象

类和对象

1. 类和对象的基本概念

  • 类 (Class): 类是C++中的一种用户定义的数据类型,它封装了数据和操作这些数据的函数。类定义了对象的属性和行为。
  • 对象 (Object): 对象是类的实例。创建对象时,类的构造函数被调用来初始化对象的属性。
注意事项:
  • 类的定义通常放在头文件 (.h 或 .hpp) 中,类的实现放在源文件 (.cpp) 中。
  • 类名通常使用大写开头的驼峰命名法,如 MyClass

2. 类的定义和成员

  • 成员变量 (Member Variables): 又称数据成员,是类中定义的数据。
  • 成员函数 (Member Functions): 又称方法,是类中定义的函数,用于操作成员变量。
class MyClass {
public:
    int myVariable;       // 成员变量
    void myFunction();    // 成员函数
};
注意事项:
  • 成员变量应尽量使用私有访问修饰符 (private),通过公有成员函数 (public) 进行访问,以实现封装。

3. 构造函数和析构函数

  • 构造函数 (Constructor): 用于初始化对象,当对象创建时自动调用。构造函数没有返回类型,其名称与类名相同。
  • 析构函数 (Destructor): 用于清理对象,当对象销毁时自动调用。析构函数也没有返回类型,其名称与类名前加波浪号 (~) 相同。
class MyClass {
public:
    MyClass() { /* 构造函数 */ }
    ~MyClass() { /* 析构函数 */ }
};
注意事项:
  • 如果没有定义构造函数,C++编译器会生成一个默认构造函数。
  • 析构函数不能被重载,一个类只能有一个析构函数。

4. 访问控制和封装

  • 访问修饰符 (Access Specifiers): 用于控制类成员的访问权限,包括 public, private, 和 protected
    • public: 公有成员可以被任何代码访问。
    • private: 私有成员只能被类的成员函数访问。
    • protected: 保护成员可以被类和其派生类的成员函数访问。
class MyClass {
private:
    int privateVar;
public:
    int publicVar;
protected:
    int protectedVar;
};
注意事项:
  • 在实际开发中,建议成员变量尽量使用 private,通过公有成员函数提供访问接口,以实现封装和信息隐藏。

5. this指针

  • this指针: 每个对象内部都有一个 this 指针,指向调用成员函数的对象本身。在成员函数中可以使用 this 指针访问对象的成员变量和成员函数。
class MyClass {
public:
    void setVar(int var) {
        this->myVariable = var;
    }
private:
    int myVariable;
};
注意事项:
  • this 指针只能在类的成员函数中使用,不能在静态成员函数中使用。

6. 静态成员

  • 静态成员变量 (Static Member Variables): 属于类而不是某个具体对象的变量。它们在所有对象之间共享。
  • 静态成员函数 (Static Member Functions): 不依赖于某个对象的成员函数,可以直接通过类名调用。
class MyClass {
public:
    static int staticVar;
    static void staticFunction() {
        // 静态成员函数只能访问静态成员变量
        staticVar = 10;
    }
};

int MyClass::staticVar = 0; // 静态成员变量的定义
注意事项:
  • 静态成员变量需要在类外定义和初始化。
  • 静态成员函数不能访问非静态成员变量和成员函数。

7. 常量成员函数和常量对象

  • 常量成员函数 (Const Member Functions): 不修改对象状态的成员函数。用 const 关键字修饰。
  • 常量对象 (Const Objects): 不可修改的对象,用 const 关键字修饰。
class MyClass {
public:
    void myFunction() const {
        // 不能修改成员变量
    }
};

const MyClass obj;
obj.myFunction(); // 常量对象只能调用常量成员函数
注意事项:
  • 常量成员函数只能调用其他常量成员函数。
  • 常量对象只能调用常量成员函数。

8. 友元函数和友元类

  • 友元函数 (Friend Functions): 可以访问类的私有和保护成员的非成员函数,用 friend 关键字声明。
  • 友元类 (Friend Classes): 允许访问另一个类的私有和保护成员的类,用 friend 关键字声明。
class MyClass {
private:
    int privateVar;
public:
    friend void friendFunction(MyClass& obj);
};

void friendFunction(MyClass& obj) {
    obj.privateVar = 10; // 友元函数可以访问私有成员
}
注意事项:
  • 使用友元函数和友元类时要谨慎,避免破坏类的封装性。

9. 运算符重载

  • 运算符重载 (Operator Overloading): 允许为用户定义的类重载运算符,使其能够对对象进行操作。
class MyClass {
public:
    int var;
    MyClass operator+(const MyClass& other) {
        MyClass result;
        result.var = this->var + other.var;
        return result;
    }
};
注意事项:
  • 并非所有运算符都可以重载。
  • 重载运算符应保持运算符的原有语义,避免滥用。

10. 继承和多态

  • 继承 (Inheritance): 允许一个类继承另一个类的属性和行为,形成父类 (Base Class) 和子类 (Derived Class) 的关系。
  • 多态 (Polymorphism): 允许使用基类指针或引用调用子类的重载函数。通过虚函数 (Virtual Functions) 实现。
class Base {
public:
    virtual void show() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class" << std::endl;
    }
};
注意事项:
  • 构造函数不能是虚函数。
  • 使用多态时,确保基类的析构函数是虚函数。

11. 抽象类和纯虚函数

  • 抽象类 (Abstract Class): 包含一个或多个纯虚函数的类,不能创建对象。
  • 纯虚函数 (Pure Virtual Functions): 没有实现的虚函数,用 = 0 语法声明。
class AbstractClass {
public:
    virtual void pureVirtualFunction() = 0; // 纯虚函数
};
注意事项:
  • 子类必须实现所有纯虚函数才能实例化对象。

12. 组合与聚合

  • 组合 (Composition): 一个类包含另一个类的对象,形成“拥有”关系。
  • 聚合 (Aggregation): 一个类包含另一个类的指针或引用,形成“部分-整体”关系。
class Engine {};

class Car {
private:
    Engine engine; // 组合关系
};

class Person {
private:
    Car* car; // 聚合关系
};
注意事项:
  • 组合关系中,包含对象的生命周期由包含类管理。
  • 聚合关系中,包含对象的生命周期不受包含类影响。

13. 深拷贝和浅拷贝

  • 浅拷贝 (Shallow Copy): 复制对象时,只复制对象的内存地址,原对象和副本共享同一块内存。
  • 深拷贝 (Deep Copy): 复制对象时,创建原对象的完整副本,两者独立。
class MyClass {
public:
    MyClass(const MyClass& other) {
        // 实现深拷贝
    }
};
注意事项:
  • 如果类包含指针成员,确保实现深拷贝以避免潜在的内存泄漏或悬挂指针。

14. 智能指针

  • 智能指针 (Smart Pointers): 提供自动内存管理的指针,包括 std::unique_ptr, std::shared_ptr, 和 std::weak_ptr
#include <memory>

std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>();
注意事项:
  • 使用智能指针可以避免内存泄漏和悬挂指针问题,但需要理解其生命周期和使用场景。

通过以上各个

知识点的整理和讲解,你可以对C++中的类和对象有一个全面的了解。每个知识点都有其重要性和应用场景,掌握这些知识将有助于编写更高效、健壮的C++代码。

标签:函数,对象,成员,C++,注意事项,MyClass,public
From: https://blog.csdn.net/weixin_73646107/article/details/140934419

相关文章

  • C++初学(11)
    不知不觉就第11篇了QWQ11.1、指针和自由存储空间之前提到了计算机程序在存储数据时必须跟踪的3个基本属性:(1)信息存储在何处;(2)存储的值为多少;(3)存储的信息时什么类型。之前我们通过定义一个简单变量,让声明语句指出了值的类型和符号名,让程序为值分配内存,还在内部跟踪该内存单......
  • emsdk安装和编译2个C++基础示例
    参考地址:Downloadandinstall—Emscripten3.1.65-git(dev)documentation 环境:ubuntu24.04LTSgcc(Ubuntu13.2.0-23ubuntu4)13.2.0g++(Ubuntu13.2.0-23ubuntu4)13.2.0cmakeversion3.28.3 Firstcheckthe Platform-specificnotes belowandinstallan......
  • Python面向对象课程设计
    面向对象程序设计面向对象编程(Object-orientedProgramming,简称OOP),是一种封装代码的方法。面向对象中,常用术语包括:类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的tortoise表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(......
  • leetcode200. 岛屿数量C++题解,精美图例和流程图,一题带你弄懂图的dfs遍历算法
    leetcode200.岛屿数量给你一个由‘1’(陆地)和‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[[“1”,“1”,“1”,......
  • C/C++ 面试常见问题
    1.封装、继承和多态是什么?封装:将具体实现过程和数据封装成一个函数,只能通过接口访问,降低耦合性,使类成为一个具有内部数据自我隐藏能力且功能独立的软件模块。封装能够通过提供公共接口访问、不让类外的程序直接访问或修改来防止类中代码被破坏。继承:子类继承父类的行为和特征,复......
  • java面对对象基础
    1.对象的内存布局类实例化为对象:类实例化为对象的语句一定要加括号,否则编译不通过//类名生成对象名=new类名()//类名生成对象名=new类名()ToolMytool=newTool();classTool{ publicbooleanoddOreven(intnum){ if(num%2!=0){ returntrue; }else{ retur......
  • C++ 中,static 和非 static
    在C++中,static和非static的变量在作用域、生命周期和初始化方面有一些重要的区别。下面详细解释这两种变量的不同之处:非static变量inti0=123;作用域:变量i0的作用域是它所在的代码块或函数。它只能在定义它的代码块内访问。生命周期:每次进入代码块时,变量i0会被创......
  • 重学面向对象-基础篇02包和访问控制
    包和访问控制基础概念包:用于区分类位置,将类分类package包的命名规则:英文和数字的组合,最好以域名形式com.test访问权限控制:private:私有,无法被除当前类以外的任何位置访问什么都不写:默认,只能被类本身和同包中的其他类访问protected:受保护,标记为受保护的内容可以能被类本身和......
  • [C++] 简单解析http请求
    #include<iostream>#include<string>#include<map>#include<vector>#include<regex>classHttpRequest{public:enumMethod{GET,POST,UNKNOWN};enumError{SUCCESS,......