当前位置: 首页 > ds >正文

C++笔记

一.指针与引用的区别:

1.指针是一个实际的变量,引用是一个别名
2.指针可以为空,引用不行
3.引用在定义的时候只能初始化一次,后面就不能变了,指针可以变
4.指针需要通过解引用操作符(*)访问目标对象,而引用直接作为原变量的别名使用,无需特殊符号

int a = 10;
int* p = &a;
int& r = a;
cout << *p;  // 需要解引用
cout << r;   // 直接使用

5.指针支持算术运算(如 ++--+-),引用不具备此特性。

int arr[3] = {1, 2, 3};
int* p = arr;
p++;        // 指向 arr[1]
int& r = arr[0];
r++;        // 直接修改 arr[0] 的值,而非移动引用目标

6.sizeof(指针) 返回指针变量的大小(如 4 或 8 字节),sizeof(引用) 返回目标对象的大小。

int a = 10;
int* p = &a;
int& r = a;
cout << sizeof(p);  // 输出 4(32 位系统)或 8(64 位系统)
cout << sizeof(r);  // 输出 sizeof(int)(如 4)

7.指针可以有多级(如 int** 表示指向指针的指针),而引用只能有一级(C++ 不支持引用的引用)

int** pp;    // 合法
int&& rr = 1;// C++11 右值引用,非“引用的引用”

8.指针作为参数需显式传递地址,引用参数语法更简洁,直接传递对象本身。

void func_ptr(int* p) { /* 需处理空指针 */ }
void func_ref(int& r) { /* 无需空检查(调用时已绑定对象)*/ }int main() {int a = 10;func_ptr(&a);  // 显式取地址func_ref(a);   // 隐式传递引用
}

9.指针可以不初始化(但危险),引用必须初始化且始终关联有效对象,避免了空引用问题。

int* p;         // 合法(但未初始化,危险!)
// int& r;      // 编译错误:引用必须初始化

二.内联函数的理解:

1.节约每次调用函数带来的额外消耗时间,替换发生在编译阶段,减少出入栈的开销,提高了程序段运行效率,使用inline关键字修饰函数。不能是循环语句、过多的条件判断、函数体不能过大、不能对函数体进行取地址操作。

2.内联函数是性能优化的利器,但需谨慎使用。优先对简单、高频调用的函数内联,避免滥用导致代码膨胀。结合编译器的优化策略,合理利用 inline 关键字,可以在保证代码可维护性的同时提升程序效率

inline int add(int a, int b) {return a + b;
}
// 调用 add(3,5) 可能被替换为直接计算 3+5

三.仿函数

1.仿函数通过类重载 operator() 实现,本质是对象,但可以像函数一样调用。

class Adder {
public:int operator()(int a, int b) { return a + b; }
};
Adder adder;  // 对象实例
int sum = adder(3, 5);  // 调用 operator()

 

2.与 STL 协同工作,STL 算法(如 std::sortstd::transform)依赖仿函数作为谓词或操作器。

// 使用仿函数排序(按字符串长度)
struct LengthComparator {bool operator()(const std::string& a, const std::string& b) {return a.size() < b.size();}
};std::vector<std::string> words = {"apple", "banana", "cherry"};
std::sort(words.begin(), words.end(), LengthComparator());

四.类模板

在 C++ 中,类模板(Class Template) 是泛型编程(Generic Programming)的核心工具,它允许开发者定义类型无关的类,通过参数化类型实现代码复用和抽象。以下是类模板的深度解析:


1. 核心概念

  • 类型参数化:类模板将数据类型作为参数,使得类的成员变量、成员函数等可以动态适配不同类型。

  • 延迟实例化:模板本身不生成代码,只有在具体类型实例化时,编译器才会生成对应的类代码。

  • 编译时多态:通过模板参数实现多态行为,无需运行时虚函数开销。

    // 定义类模板
    template <typename T>
    class Box {
    public:Box(const T& value) : data(value) {}T get() const { return data; }
    private:T data;
    };// 实例化为具体类
    Box<int> intBox(42);      // T 替换为 int
    Box<std::string> strBox("Hello");  // T 替换为 string

http://www.xdnf.cn/news/4324.html

相关文章:

  • Web3 应用中常见的数据安全风险及防护措施
  • 使用AI应用开发平台搭建夸奖机器人,玩转AI【COZE入门案例-第1课】
  • 精益数据分析(43/126):媒体网站商业模式的盈利与指标解析
  • RAG框架搭建(基于Langchain+Ollama生成级RAG 聊天机器人)
  • Windows远程连接MySQL报错,本地navicat能连接MySQL
  • Docker安装使用
  • Android SDK 开发中的 AAR 与 JAR 区别详解
  • BUUCTF Pwn [ZJCTF 2019]Login WP
  • uv简单使用
  • Linux环境基础与开发工具使用
  • Linux——特殊权限管理
  • 用html+js+css实现的战略小游戏
  • C++内联函数
  • vue引入物理引擎matter.js
  • Transformer-LSTM混合模型在时序回归中的完整流程研究
  • 使用Unsloth微调DeepSeek-R1蒸馏模型:低显存高效训练实践
  • String 字符串基础和常用API
  • 钢厂首选,profinet转profibus在煤电项目中的协议转换解决方案
  • CAN报文中UDS部分的帧类型
  • ONLYOFFICE 文档 API :新的文档格式支持及配置方法
  • VNP46A3灯光遥感数据全球拼接并重采样
  • ArcGIS Pro图斑属性自动联动更新-在线卫星底图图斑采集
  • Kotlin密封类优化Android状态管理
  • 技术对暴力的削弱
  • 前端知识-forwardRef
  • 数字孪生储能充电站,实现智慧能源设施全景管控
  • 63.微服务保姆教程 (六) SkyWalking--分布式链路追踪系统/分布式的应用性能管理工具
  • 乘法逆元【费马小定理+扩展欧几里得】
  • MySQL性能调优探秘:我的实战笔记 (上篇:从EXPLAIN到SQL重写)
  • iPaaS制造案例丨某照明行业头部企业借助谷云科技iPaaS步入数字化转型“快车道”