c++ 杂记

  1. 为什么返回*this?
  1. 友元函数的使用:需要头文件中类内外声明,cpp文件中实现定义哦
cpp 复制代码
// Sales_data.h
#ifndef SALES_DATA_H
#define SALES_DATA_H

#include <string>

class Sales_data {
    std::string bookNo;
    int units_sold = 0;
    double revenue = 0.0;

public:
    // 只声明,不定义
    Sales_data& combine(const Sales_data&);

    // 友元函数:仅声明(friend 关键字 + 函数签名)
    friend Sales_data add(const Sales_data& lhs, const Sales_data& rhs);
    friend std::ostream& print(std::ostream& os, const Sales_data& item);
};

// 类外函数声明(必须!)
Sales_data add(const Sales_data& lhs, const Sales_data& rhs);
std::ostream& print(std::ostream& os, const Sales_data& item);

#endif

4.template

模板的定义必须放在头文件中,不是因为"被其他类使用",而是因为:

编译器在实例化模板时,必须"看到"完整的定义(而不仅仅是声明)

✅ 这与普通函数/类的"声明-定义分离"模型完全不同


🧩 一、普通函数 vs 模板函数:关键区别

❌ 普通函数:可以分离声明与定义

复制代码
// utils.h
void print(int x);  // 声明

// utils.cpp
void print(int x) {         // 定义
    std::cout << x << "\n";
}
  • 编译 main.cpp 时,只需要知道 print 存在(有声明)
  • 链接时,链接器找到 print 的定义

✅ 成功!


❌ 模板函数:不能这样分离!

复制代码
// utils.h
template<typename T>
void print(const T& x);  // 只有声明

// utils.cpp
template<typename T>
void print(const T& x) {        // 定义
    std::cout << x << "\n";
}

// main.cpp
#include "utils.h"
print(42);        // ❌ 编译错误!
print("hello");   // ❌ 编译错误!

为什么?

  • 编译器看到 print(42),需要生成 print<int>(int)
  • 但它只看到了声明,没看到定义
  • 所以无法生成具体代码
  • 链接时也找不到 print<int>,报 undefined reference

👉 模板不是函数,它是一个"生成函数的蓝图"


✅ 正确做法:定义放在头文件中

复制代码
// utils.h
#ifndef UTILS_H
#define UTILS_H

#include <iostream>

// 定义在头文件中
template<typename T>
void print(const T& x) {
    std::cout << x << "\n";
}

#endif

// main.cpp
#include "utils.h"  // 包含了完整定义
print(42);        // ✅ 编译器看到定义,可以实例化 print<int>
print("hello");   // ✅ 实例化 print<const char*>

🧠 二、为什么必须"看到定义"?

因为模板实例化发生在 编译期(compile time),而不是链接期。

编译器要做:

  1. 看到 print(42)
  2. 推导出 T = int
  3. 生成 函数代码:void print<int>(const int&)
  4. 内联或调用

👉 这个过程需要完整的函数体(定义),而不仅仅是签名。

相关推荐
2401_8920709821 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei21 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
Wenweno0o21 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
chenjingming66621 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
cch891821 小时前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳21 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense1 天前
设计模式之工厂模式
java·开发语言·设计模式
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++
勿忘,瞬间1 天前
数据结构—顺序表
java·开发语言