C++一分钟之-类与对象初步

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
大数据开发治理平台 DataWorks,不限时长
实时计算 Flink 版,5000CU*H 3个月
简介: 【6月更文挑战第20天】C++的类是对象的蓝图,封装数据和操作。对象是类的实例。关注访问权限、构造析构函数的使用,以及内存管理(深拷贝VS浅拷贝)。示例展示了如何创建和使用`Point`类对象。通过实践和理解原理,掌握面向对象编程基础。

C++作为一门面向对象的编程语言,类(class)对象(object)的概念构成了其核心基石。本文旨在深入浅出地介绍类与对象的基本概念、常见问题、易错点及避免策略,并通过简洁的代码示例帮助读者快速上手。
image.png

类(Class): 对象的蓝图

基本概念

类是一种用户自定义的数据类型,它封装了数据(属性或成员变量)和操作这些数据的方法(成员函数)。类定义了一个对象的形式和行为。

常见问题与避免

  • 访问权限:公有(public)、私有(private)、保护(protected)成员的混淆。避免策略:明确区分成员的访问权限,遵循封装原则,通常将数据成员设为私有,成员函数根据需要设为公有或私有。
  • 构造函数与析构函数:忘记定义或错误使用。避免策略:确保每个类至少有一个构造函数(默认或自定义),用于初始化对象;析构函数用于资源清理,必要时手动定义。

对象(Object): 类的实例

基本概念

对象是类的实例,即根据类的定义创建的具体实体,拥有类中定义的属性和方法。

易错点与避免

  • 内存管理:未正确管理动态分配的内存。避免策略:使用智能指针如std::unique_ptrstd::shared_ptr自动管理内存,减少内存泄漏风险。
  • 深拷贝与浅拷贝:尤其在类中有指针成员时,浅拷贝(默认拷贝构造函数和赋值运算符)会导致多个对象指向同一片内存。避免策略:重载拷贝构造函数和赋值运算符,实现深拷贝逻辑。

代码示例

#include <iostream>
using namespace std;

// 类定义
class Point {
   
   
public:
    // 构造函数
    Point(int x = 0, int y = 0) : _x(x), _y(y) {
   
   }

    // 成员函数
    void display() {
   
    cout << "Point(" << _x << ", " << _y << ")" << endl; }

private:
    int _x, _y; // 私有成员变量
};

int main() {
   
   
    // 创建对象
    Point p1(3, 4);
    p1.display(); // 输出: Point(3, 4)

    // 使用默认构造函数创建对象
    Point p2;
    p2.display(); // 输出: Point(0, 0)

    return 0;
}

小结

掌握类与对象是学习C++面向对象编程的基础。通过正确设置访问权限、注意内存管理、深拷贝与浅拷贝的区别,可以有效避免许多初学者常犯的错误。实践是学习的关键,多动手编写代码,理解每个概念背后的原理,将使你在面向对象编程的道路上越走越远。记住,类是抽象的模板,而对象则是这个模板在内存中的具体体现,二者相辅相成,共同构建起C++世界中的万物。

目录
相关文章
|
10天前
|
设计模式 安全 编译器
【C++11】特殊类设计
【C++11】特殊类设计
29 10
|
15天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
43 9
|
10天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
19天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
19天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
19天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
19天前
|
C++
C++】string类的使用③(修改器Modifiers)
这篇博客探讨了C++ STL中`string`类的修改器和非成员函数重载。文章介绍了`operator+=`用于在字符串末尾追加内容,并展示了不同重载形式。`append`函数提供了更多追加选项,包括子串、字符数组、单个字符等。`push_back`和`pop_back`分别用于在末尾添加和移除一个字符。`assign`用于替换字符串内容,而`insert`允许在任意位置插入字符串或字符。最后,`erase`函数用于删除字符串中的部分内容。每个函数都配以代码示例和说明。
|
19天前
|
安全 编译器 C++
【C++】string类的使用②(元素获取Element access)
```markdown 探索C++ `string`方法:`clear()`保持容量不变使字符串变空;`empty()`检查长度是否为0;C++11的`shrink_to_fit()`尝试减少容量。`operator[]`和`at()`安全访问元素,越界时`at()`抛异常。`back()`和`front()`分别访问首尾元素。了解这些,轻松操作字符串!💡 ```
|
19天前
|
存储 编译器 Linux
【C++】string类的使用②(容量接口Capacity )
这篇博客探讨了C++ STL中string的容量接口和元素访问方法。`size()`和`length()`函数等价,返回字符串的长度;`capacity()`提供已分配的字节数,可能大于长度;`max_size()`给出理论最大长度;`reserve()`预分配空间,不改变内容;`resize()`改变字符串长度,可指定填充字符。这些接口用于优化内存管理和适应字符串操作需求。
|
19天前
|
C++ 容器
【C++】string类的使用①(迭代器接口begin,end,rbegin和rend)
迭代器接口是获取容器元素指针的成员函数。`begin()`返回首元素的正向迭代器,`end()`返回末元素之后的位置。`rbegin()`和`rend()`提供反向迭代器,分别指向尾元素和首元素之前。C++11增加了const版本以供只读访问。示例代码展示了如何使用这些迭代器遍历字符串。