news 2026/4/25 16:12:26

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/24 5:35:14

腾讯云某业务基于 DeepFlow 的可观测性实践

摘要&#xff1a;本文分享了腾讯云某业务基于 DeepFlow 的可观测性实践。面对复杂的业务服务&#xff08;800&#xff09;和多样的编程语言&#xff0c;腾讯云某业务团队选择了 DeepFlow 作为跨语言、无侵入的可观测技术。与其他技术&#xff08;如 Hubble 和 Pixie&#xff09…

作者头像 李华
网站建设 2026/4/23 23:15:57

外汇 API 是什么?从行情接口到量化研究的完整视角

刚开始做外汇程序化交易时&#xff0c;我经常问自己一个看似简单的问题&#xff1a;外汇市场没有统一交易所&#xff0c;那所谓的“外汇 API”到底从哪里来的&#xff1f; 很多教程会直接告诉你&#xff1a;“用外汇 API 拉行情就行”&#xff0c;但真正做过量化研究或搭建行情…

作者头像 李华
网站建设 2026/4/23 12:55:03

springboot+ssm体育场地器材管理系统vue

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

作者头像 李华
网站建设 2026/4/21 0:10:15

摄影评分系统:GLM-4.6V-Flash-WEB依据美学原则打分

摄影评分系统&#xff1a;GLM-4.6V-Flash-WEB依据美学原则打分 在如今这个“人人都是摄影师”的时代&#xff0c;每天有数以亿计的照片被上传到社交平台、图库网站和云相册。但问题也随之而来——我们如何快速判断一张照片是否“好看”&#xff1f;传统的图像质量评估依赖分辨率…

作者头像 李华
网站建设 2026/4/25 1:43:13

高铁轨道探伤:GLM-4.6V-Flash-WEB识别钢轨磨损痕迹

高铁轨道探伤&#xff1a;GLM-4.6V-Flash-WEB识别钢轨磨损痕迹 在高铁日均运行里程突破数万公里的今天&#xff0c;一条看不见的“神经网络”正在悄然守护着每一寸轨道的安全——那就是基于人工智能的自动化检测系统。传统靠人工敲击、目视巡检的时代正被快速淘汰&#xff0c;取…

作者头像 李华
网站建设 2026/4/23 15:19:55

广告创意设计平台引入GLM-4.6V-Flash-WEB进行视觉情感分析

广告创意设计平台引入GLM-4.6V-Flash-WEB进行视觉情感分析 在数字广告竞争日益激烈的今天&#xff0c;一个海报是否“打动人”&#xff0c;往往决定了它能否在几秒内抓住用户注意力。传统的创意评估依赖设计师经验或简单的点击率回溯&#xff0c;缺乏对视觉情绪传递效率的量化判…

作者头像 李华