news 2026/4/15 8:38:57

c++语法学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++语法学习

动态数组(vector):

vector是一个能够自动调节大小的动态数组

普通的 C++ 数组(如int arr[5])在定义时必须指定长度,且之后不能更改。而vector就像一个“可以伸缩的橡皮筋”,当你往里面添加更多数据时,它会自动向系统申请更多内存来容纳这些数据。

  • 头文件:使用时需要包含#include <vector>

vector<int>&

一个指向int类型动态数组(vector)的引用

函数参数类型:

情况 A:vector<int>(值传递)

当你调用函数时,计算机会把整个数组复制一份传给函数。

  • 缺点:如果数组里有 100 万个坐标点,复制操作会消耗大量的内存和时间(CPU)。

  • 结果:函数内部对数组的修改不会影响外部原始的数组。

情况 B:vector<int>&(引用传递)

当你调用函数时,不进行任何复制,函数直接操作原始数据。

  • 优点极其高效。无论数组多大,传递引用的开销几乎为零(类似于传递一个指针)。

  • 结果:函数内部对数组的修改会直接改变外部原始的数据。

const vector<int>&:

意义:我既想要引用传递的高效率(不复制),又不希望函数内部修改我的原始数据(只读)。

命名空间:

它就像是一个“文件夹”或者“作用域容器”,用来对变量、函数、类等名称进行分类和隔离。

命名空间就像是文件的文件夹路径D:/照片/旅游/小明.jpgD:/照片/证件/小明.jpg虽然文件名都叫“小明”,但因为路径(命名空间)不同,它们是完全不同的文件。

其核心目的只有一个:避免命名冲突(Name Collision)


1. 为什么要使用命名空间?(生活中的类比)

想象一下,你在一家大型公司工作,公司里有两个员工都叫“张伟”。

  • 如果你在走廊里大喊一声“张伟!”,两个人都可能会回头,这就是命名冲突

  • 为了区分,你会说“技术部的张伟”或者“销售部的张伟”。

在这里,“技术部”和“销售部”就是命名空间。它给“张伟”这个名字增加了一个前缀,确保你在调用时知道指向的是哪一个。


2. C++ 中的命名空间

在 C++ 中,命名空间的使用非常频繁,最著名的就是std

(1) 基本语法

你可以使用namespace关键字定义自己的空间:

#include <iostream> namespace RobotA { void move() { std::cout << "机器人A正在移动" << std::endl; } } namespace RobotB { void move() { std::cout << "机器人B正在全速冲刺" << std::endl; } } int main() { // 使用 作用域解析运算符 :: 来访问 RobotA::move(); RobotB::move(); return 0; }
(2) 什么是std::

stdStandard(标准)的缩写。C++ 标准库提供的所有内容(如vector,cout,string)都放在std这个命名空间里。

  • 只有写std::vector,编译器才知道你使用的是标准库提供的那个 vector,而不是你自己定义的一个叫 vector 的变量。

特性描述
本质名字的分类容器
核心功能防止名字相同导致的混乱(冲突)
C++ 访问符::(双冒号,例如std::cout

类:


一、 类的基本结构

类使用关键字class定义,紧跟着类名和一对大括号。注意:大括号末尾必须有一个分号;

class Robot { public: // 访问修饰符 // 成员变量(属性) string name; int id; // 成员函数(行为/方法) void move() { cout << name << " is moving." << endl; } }; // 必须有分号
  • 对象(Object):类是图纸,对象是根据图纸造出来的实体。

    Robot myRobot; // 这就是实例化了一个对象


二、 访问修饰符(Access Modifiers)

这是 C++ 实现“封装”的关键。它决定了类成员对外部代码的可见性。

  1. public(公有):类外部的代码可以直接访问。

  2. private(私有)默认级别。只能在类内部的成员函数中访问。外部通过“接口”(Getter/Setter)访问。

  3. protected(保护):类内部及派生类(子类)可以访问,外部不可访问。


三、 构造函数与析构函数(Lifecycle)

1. 构造函数 (Constructor)

在创建对象时自动调用,用于初始化数据。

  • 名字必须与类名完全相同。

  • 没有返回类型。

  • 可以重载(有多个参数不同的构造函数)。

2. 初始化列表 (Initialization List) ——C++ 特有且推荐

在构造函数体执行前初始化成员,效率更高。

class Robot { private: int battery; public: // 构造函数使用初始化列表 Robot(int b) : battery(b) { cout << "Robot initialized with " << battery << "% battery." << endl; } };
3. 析构函数 (Destructor)

在对象销毁(生命周期结束)时自动调用,用于清理资源(如释放内存、关闭文件)。

  • 名字为~类名

  • 无参数,无返回值,不可重载。


四、this指针

this是一个隐含在所有非静态成员函数中的指针,它指向当前调用该函数的对象本身

  • 常用于区分成员变量和参数名冲突。

  • this->name = name;(左边是类的成员,右边是传入的参数)


五、 成员函数的类外定义

为了保持类定义简洁,通常在类内声明,在类外使用作用域解析运算符::定义。

class Robot { public: void stop(); // 声明 }; // 类外定义 void Robot::stop() { cout << "Emergency Stop!" << endl; }

六、 静态成员(Static Members)

使用static关键字。静态成员属于类本身,而不是某个具体的对象。

  1. 静态成员变量:所有对象共享同一个变量副本(必须在类外初始化)。

  2. 静态成员函数:只能访问静态成员,不能访问普通成员,且没有this指针。

class Robot { public: static int robot_count; // 静态变量声明 Robot() { robot_count++; } }; int Robot::robot_count = 0; // 类外初始化

七、 封装与 Getter/Setter

这是为了保护数据的安全性,防止外部代码胡乱修改。

class Robot { private: double speed; // 私有化,外部不可见 public: // Setter:设置值时可以加逻辑判断 void setSpeed(double s) { if(s >= 0) speed = s; } // Getter:读取值 double getSpeed() { return speed; } };

八、 常量成员函数(Const Member Functions)

如果一个成员函数保证不修改类中的任何成员变量,应将其声明为const。这增加了代码的健壮性。

void showStatus() const { // 报错:不能在这里修改成员变量 // speed = 10; cout << "Battery: " << battery << endl; }

九、 友元(Friend)

friend关键字允许特定的外部函数或类访问当前类的private成员。这打破了封装,应谨慎使用(常用于运算符重载)。


总结:C++ 类与 Python 类的语法对比

特性C++ 类Python 类
结尾分号必须有;
访问控制严格的public/private关键字靠命名约定(如___
构造函数ClassName()__init__(self)
内存管理析构函数手动清理/RAII垃圾回收机制 (GC)
默认访问privatepublic
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 15:49:07

【内网运维】Wireshark 过滤语法详细解析

Wireshark 过滤语法详细解析&#xff08;实战指南&#xff09; 作为网络流量分析领域的核心工具&#xff0c;Wireshark 的过滤语法是高效定位目标流量的 “钥匙”。本文以视角&#xff0c;系统拆解 Wireshark 过滤语法的核心规则、分类用法、高级技巧&#xff0c;并结合渗透测…

作者头像 李华
网站建设 2026/4/5 1:36:53

美妆试妆系统:GLM-4.6V-Flash-WEB虚拟涂抹口红色号

美妆试妆系统中的视觉智能革命&#xff1a;基于 GLM-4.6V-Flash-WEB 的虚拟口红涂抹实现 在直播带货和线上美妆选购日益普及的今天&#xff0c;用户不再满足于“看图说话”式的商品展示。他们想要的是——我涂上这支口红会是什么样子&#xff1f; 尤其是面对琳琅满目的“豆沙色…

作者头像 李华
网站建设 2026/4/11 6:58:13

电子产品组装质检:GLM-4.6V-Flash-WEB确认元件焊接位置

电子产品组装质检&#xff1a;GLM-4.6V-Flash-WEB确认元件焊接位置 在现代电子制造车间里&#xff0c;一条SMT贴片生产线每小时能完成数千块PCB的焊接作业。然而&#xff0c;当电路板进入质检环节时&#xff0c;工程师却常常面临一个尴尬的局面&#xff1a;明明机器已经高度自动…

作者头像 李华
网站建设 2026/4/14 21:18:31

springboot+ssm汽车租赁推荐系统vue

目录摘要开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 基于SpringBoot、SSM框架和Vue.js的汽车…

作者头像 李华
网站建设 2026/4/14 3:35:24

springboot+ssm田径运动会成绩管理系统_-vue

目录系统概述核心功能技术亮点应用价值开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 Sprin…

作者头像 李华