Effictive C++ 第一章 让自已习惯c++

本文深入探讨C++编程的关键概念,如将C++视作联邦,优化编程实践,使用const、enum、inline替代#define,确保变量正确初始化,以及合理利用构造函数。强调const的有效运用,提升代码质量和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一章 让自已习惯c++
1,将c++视为一个联邦
从一个次语言迁移到另一个次语言的时候,原则可能改变.这一些次语言包括C语言 面向对象 模板元编程 STL 比如就内置类型 C编程时侯传值要比传引用高效但面向对象时对于自定义类型则反之
2,用const enum inline 代替#define
首先为什么要代替#define 因为他没有作用域和封装的概念,然后他是预编译指令我们看到的和编译器看到的并不用,夜编译进行的替换可能会导致错误。
#define a (1.23)
const b=1.23
这里的a并不会进入符号表而b可以而且替换产生的代码量要大于常量
有一个特殊的规定 类的静态常量如果是整型(int char enum)可以在声明的时候赋初值但这不是定义而且不需亚定义,除非需要取地址的时候
class a
{
private: static const int m=5;//这是声明
}
const int a::m;//这是定义
遗憾的是不是所有的编译器都支持这种in-class初值设定但有时又需要声明时指定初值 比如
class a{
private: static const int m=5;
int num[m];
}
数组需要声明时指定大小且为常量 解决办法为用enum替代
enum{m=5}
我们经常这样写
#define MAX(a,b) ((a)>(b)?(a):(b))
这样写的好处是可以避免函数调用的开销,但是由于预编译替换的原因,使得可能出现未知的错误,即使你的实参都加了括号。比如
int a=5,b-0;
MAX(++a,b);
int a=5,b=10;
MAX(++a,b)
前者执行完a=7,后者a=6 这取决于和谁比较
为了得到宏的快捷和函数的安全性(作用域与访问限制)我们可以写成template inline的函数
template
inline int MAX(const &T a,const &T b)
{
return (a>b?a:b);
}
宏我们可以用const enum和inline处理,但是#include,#ifdef等预编译指令是目前无法替代的
3.尽量使用const
如果已经知道这个值不变,那么就告诉编译器,让编译器帮助你检查
const int *p与int const *p一样都是不能通过他改变指向的值 称为指常量指针,他被称为底层const low level const
int const p 不能改变指针指向的地址 称为指针常量,他被称为顶层const top level const
当const 作用在STL上时
const vector::iterator p等价于T
const p 是常量指针指针本身不能变也就不能递增或递减而要定义指针常量需用vector ::const_iterator p 它可以递增递减但不能通过它改变指向的值
const 真正有威力的是它可以和函数的返回值 形参和函数本身联合使用
const multipy operator (const &op1,const &op2){}
它重载了乘法返回常量意味着,操作后的值不能改变比如if(a
b=c)这种笔误就无效
const 成员函数的含义为,不能通过这个函数修改类的非静态变量,如果2个成员断数只有是不是const 的区别那么他俩可以被重载,重载的区别就是是否为常量对象调用
char& operator [](const int pos){return text[pos]}
const char& operator[](const int pos) const{return text[pos];}
T tb
tb[0]=0调用前者合法
const T ctb
ctb[0]=0 调用后者不合法 同为他返回的是常量引用
这里返回值为引用是必要的 如果是char那么被赋值的是个副本第一个存储位置的值不会变
bitwise const与logical const的区别没看懂
补充有关const形参凼叛的重载和隐式转换的内容,
4.保证变量的初始化
构造函数:
自定义类的初始化通过构造函数实现,需要说明的是,在进入构造函数体执行的赋值语句,不算初始化。所谓的初始化是动作在进入构造函数之前。1在构造函数内部赋值的操作其实分为两步,先调用default构造函数为类的变量初始化,然后这些变量立即在函数体内赋予新值,default构造函数做的工作都浪费了,效率低。所以都是采用构造函数初始化列表的形式实现,初始化列表在初始化的时候调用的是拷贝构造函数。
初始化顺序:
变量的初始化顺序去取决于声明顺序,与在初始化列表中的顺序无关
不同编译单元内定义的非局部static变量的初始化顺序:
static可以定义在namaspace、class、file和函数中,其中在函数中的是local static,其他所有的都是non-local static.由于不同编译单元内定义的非局部static变量的初始化顺序是不确定的,所以当一个编译单元内定义的非局部static变量用另一个编译单元内定义的非局部static变量初始化,那么他的值是不确定的。解决的方案,就是将non-local变成local,具体来讲,为这个变量写一个函数,在函数内部定义为static形式,并且返回他的引用。原理在于,C++保证,函数内的non local static对象在该函数调用期间,首次遇到定义时被初始化。

内容概要:本文深入解析了扣子COZE AI编程及其详细应用代码案例,旨在帮助读者理解新一代低门槛智能体开发范式。文章从五个维度展开:关键概念、核心技巧、典型应用场景、详细代码案例分析以及未来发展趋势。首先介绍了扣子COZE的核心概念,如Bot、Workflow、Plugin、Memory和Knowledge。接着分享了意图识别、函数调用链、动态Prompt、渐进式发布及监控可观测等核心技巧。然后列举了企业内部智能客服、电商导购助手、教育领域AI助教和金融行业合规质检等应用场景。最后,通过构建“会议纪要智能助手”的详细代码案例,展示了从需求描述、技术方案、Workflow节点拆解到调试与上线的全过程,并展望了多智能体协作、本地私有部署、Agent2Agent协议、边缘计算插件和实时RAG等未来发展方向。; 适合人群:对AI编程感兴趣的开发者,尤其是希望快速落地AI产品的技术人员。; 使用场景及目标:①学习如何使用扣子COZE构建生产级智能体;②掌握智能体实例、自动化流程、扩展能力和知识库的使用方法;③通过实际案例理解如何实现会议纪要智能助手的功能,包括触发器设置、下载节点、LLM节点Prompt设计、Code节点处理和邮件节点配置。; 阅读建议:本文不仅提供了理论知识,还包含了详细的代码案例,建议读者结合实际业务需求进行实践,逐步掌握扣子COZE的各项功能,并关注其未来的发展趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值