C++_读书笔记_C++_Primer-类

类的设计者和类的调用者

普通函数和成员函数的不同地方
    普通函数-- 参数列表 返回值 函数名  函数重载 inline 函数
	       函数体内部变量
		--非成员函数
	成员函数--成员变量--编译器先编译成员的生命--然后才编译成员函数体
	   this --不在成员变量和参数列表中--隐式定义的
	  控制对象的初始化过程--特殊的成员函数
             构造函数(constructor)--没有返回值类型 不能被声明为const
             多个构造函数--类似于重载函数	
                默认的构造函数 default constructor --初始化类的数据成员的规则	
				一旦定义了其他构造函数--类就没有默认构造函数了:规则依据--
				           --如果一个类在某种情况需要控制对象的初始化,那么该类很可能在所有情况下都需要控制
			               --可能执行错误的操作--有些编译器无法
				Sales_data()=default   default和delete
				
				构造函数初始值列表--成员变量初始化(从外部)
				                  --成员变量--雷内初始值
	  控制--拷贝-赋值和销毁对象时发生的行为
	      使用赋值运算符时
	一些成员与类本身相关,而不是与类的各个对象保持关联--static   public static   private static
		  
访问说明符 
    private--public	
friend --类可以允许其他类或者函数范文它的非公有成员--方法是令 其他类或者函数称为它的友元 friend
    为其成员函数做友元声明 friend  类内声明--
	友元函数 友元类   友元关系不存在传递性--每个类负责控制自己的友元函数或者友元类
函数声明--友元声明--函数定义

类的作用域外--对象--引用或者指针使用成员访问符	
        箭头符号(->) 当通过指针访问结构体或类的成员时,需要使用箭头符号来代替点号。
		点号(.) 通过结构体变量访问成员变量 通过指针进行解引用(*p)来访问
		 双冒号(::) 域运算符访问   
	 访问静态成员 ::  .  ->  
类外部定义成员函数

IO类不能被拷贝的类型, 引用来传递他们,而且会改变流的内容--普通引用
    普通引用
    常量的引用
	
--变量--变量名 
 using  类型
 类类型	 

  ---
  使用--拷贝类的对象其实是拷贝对象的数据成员

IO对象

 IO对象无拷贝和赋值
      形参和返回值类型
        引用方式传递和返回类型
        不能是const	
 i  o  io  wi  wo wio
 if of f  wif wof wf
###文件 
  .open(s) .close()
  .is_open()
 file_mode 文件模式: in out  app  ate trunc  binary	  
 
 
 
 istring ostring string wistring wostring wstring	 
		std::stringstream 
	std::stringstream 是 C++ 标准库中定义的类,位于 <sstream> 头文件中。它是一个可以在字符串和流之间进行转换的工具
	    用字符串初始化:
          stringstream(const string& str); //通过传递一个字符串来初始化流对象。并将该字符串内容放入流中
        获取流中的字符串内容 
		向stringstream中写入数据:
		     ss << variable
		清除流的内容:
            ss.str(""); // 清空内容 ‌等价于ss.str(std::string());  是一个空字符串‌。在C++中,std::string() 构造了一个空的字符串对象,即一个没有任何字符的字符串‌
            ss.clear(); // 重置状态标志(比如 eof, fail)
流  缓冲区 flush endl
	
std::setw()   是C++标准库中定义的一个流操作符,用于设置输出字段的宽度		
std::setfill() 函数用于在输出流中输出特定的字符,直到达到指定宽度。该宽度通常由 setw() 函数设置。如果输出值小于指定的宽度,则会在其前面填充指定的字符		

record

record_base.h
    static  const std::string & kEmptystring ="";
	virtual uint64_t GetMessageNumber(const std::string& channel_name) const =0;
	virtual std::set<std::string>GetChannleList() const = 0;
	virtual const std::string& GetMessageType(const std::string& channel_name) const=0;
	const std::string getFile() const{return file ;}
	
	常量字符串对象的引用
	    如果函数返回一个局部std::string对象,每次调用该函数时都会创建一个新的字符串副本。使用引用可以避免这种不必要的复制,从而提高效率
	    确保传递给函数的字符串对象具有足够的生命周期。如果必须传递临时对象,可以考虑使用 const std::string&
		使用字面量(如字符串字面量)来初始化一个 const std::string& 类型的变量。不会发生复制,因为编译器会直接使用字面量的内部表示。
		
		
	   public 
	   protected 基类成员对派生类
	   private 
	   Friend 友元是一种特殊的访问控制机制,允许特定函数或类访问另一个类的私有(private)和保护(protected)成员,突破了传统封装性的限制
	virtual 纯虚函数--未实现的函数
       virtual =default  = 0    函数声明后面加上=0;
      声明纯虚函数的一般形式是 virtual 函数类型 函数名 (参数表列) =0; 留待派生类中定义”		   
      声明语句,最后应有分号;
	const  
      声明 const 成员函数 在成员函数的声明和定义中,在参数列表的末尾加上 const 关键字
          当一个成员函数被声明为const时,它承诺不会修改类的任何成员变量。
		     这使得const成员函数可以被const对象调用,增强了代码的安全性和可读性。

        const 在C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。
           01. 函数 形参  前面加const  函数fun内部不能被修改, 如果在函数内的语句试图修改a,编译器就会报错
		   02. 函数 返回的指针或者引用,加const规定返回值不能修改
           03. 修饰函数体  const 修饰函数体时,放到函数体的行尾处,表明在
		       该函数体内,
			        不能修改对象的数据成员,且 不能调用 非 const 成员函数。

record_writer.h

C++中,继承是通过指定继承方式来实现的,常见的继承方式有三种:
   public    继承:基类的 public和protected成员在派生类中保持相同的访问控制。
   protected 继承:基类的 public成员在派生类中变为protected,而protected成员保持不变。
   private   继承:基类的 所有非private成员在派生类中都变为private
类型声明 
 using MessageNumberMap = std::unordered_map<std::string,unit64_t>;
 using FileWriterPtr = std::unique_ptr<RecorderFileWriter>;	
 FileWriterptr file_write_ = nullptr;
 const 	  std::shared_ptr<message::RawMessage>& message

 explicit 是一个关键字,用于修饰类的构造函数,以防止编译器进行隐式类型转换
    ,它用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的。
	当使用explicit修饰构造函数时,它将禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数。
 std::async 定义在头文件 <future> 中
        std::async 是一个函数模板,用于启动异步任务,并返回一个 std::future 对
				std::launch::async:强制异步执行,即在新线程中执行任务。
				std::launch::deferred:懒加载模式,即任务会在 get() 或 wait() 调用时才执行。
                std::launch::async | std::launch::deferred(默认值):由系统决定是否创建新线程
                std::launch::async | std::launch::deferred(默认值):由系统决定是否创建新线程
		最简单的匿名函数是[](){},它没有参数也没有返回值。
		     []里面用来捕获函数外部的变量,而()里面就是匿名函数的参数,{}里面就是函数的执行代码
			   Lambda函数可以省略返回类型, 而不需要使用 -> void 形式
std::unique_ptr 是一种独占所有权的智能指针。它确保一个对象只能被一个 unique_ptr 所拥有,这意味着不能复制 unique_ptr,只能移动它。			   
std::shared_ptr 是一种共享所有权的智能指针。多个 shared_ptr 可以指向同一个对象,对象的内存会在最后一个引用被销毁时释放			   
		  
   使用 std::make_unique 和 std::make_shared 来创建智能指针			  

阶段

1.基本内容和常规总结
    语法和编程模式
2.常见调试和进阶编程
   debug方式 gdb等
       多线程编程 
	   网络编程 系统编程  
3.设计模式
    类设计图等,框架图 时序图 设计模式是解决软件工程中常见问题的通用解决方案
        算法和数据结构
4.操作系统和编译器

Linux 网络流量的处理机制
      Linux 内核的做法是:立刻发起一个中断请求(IRQ),强行打断 CPU 当前正在执行的任务,转去处理这个包
	      频繁的“打断—处理—返回”的过程
	“主动轮询”+“智能切换”
          忙的时候我自己去看,闲的时候你叫我一声
            高流量时段,关闭频繁的中断请求,改为采用主动轮询:CPU 每隔一小段时间主动去网络检查是否有新包;
            低流量时段,重新启用传统中断模式,减少不必要的资源消耗
代码量: 千行  万行 百万行
   小型:一个人半年内完成的 2000 行以内的程序  千行
   中型: 5 个人在 1 年多的时间内完成的 5000-50000 行的程序;5千到5万
   大型: 5-10 人在两年内完成的 50000-100000 行的程序  5万到10万
    百万行代码项目通常涉及 ‌高并发架构‌、分布式系统、模块化设计等复杂技术;
       代码维护成本随规模非线性增长,需依赖 ‌自动化测试‌、持续集成等工程实践。            

顺序容器

 sequential container  提供控制元素存储和访问顺序的能力
      vector  string
   内置数组和array数组 array对象大小固定		  

参考

 《C++ primer 第五版》 2013年电子工业出版社出版的图书,作者是[美] Stanley B. Lippman
  CyberRT   https://github.com/ApolloAuto/apollo/tree/master/cyber
posted @ 2025-04-25 18:01  辰令  阅读(18)  评论(0)    收藏  举报