C++学习笔记

本文深入探讨C++编程的关键概念,包括头文件引用区别、命名空间管理、类型定义、内存管理、日志级别理解、操作符重载及编译流程解析。

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

随笔

头文件""与<>的区别

使用“”是搜索所有目录
使用<>是搜索当前目录

正常情况下,自行定义的头文件应该用"",因为这些文件放在工程目录(也就是编译器的当前目录)下,而不是放在公共头文件目录下,如果用<>则找不到头文件。

而系统提供的头文件,比如库函数的头文件,可以用<>。

[建议]:系统库使用 #include <>,其他库使用 #include “”

#pragma once

#pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。

namespace 命名空间

菜鸟在线 C++ 命名空间

typedef vs #define

#define 是用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

  1. typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
  2. typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

new与delete的用法

new运算符使用的一般格式为   new 类型 [初值]

用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。

new int;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)   
float *p=new float (3.14159);//开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p

__delete运算符使用的一般格式为  delete [ ]指针变量 __  
例如要撤销上面用new开辟的存放单精度数的空间,应该用   delete p

用new和delete可以动态开辟和撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数据),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。

参考:https://blog.csdn.net/zcawesome/article/details/78777832

new(std::nothrow)

在C++中new在申请内存失败时默认会抛出一个std::bad_alloc 异常。
所以,按照C++标准,如果想检查new是否成功,则应该通过try catch捕捉异常。
但有些编译器不支持try catch。
用户一般简单地使用”new(std::nothrow) 类型”。
new在分配内存失败时会抛出异常,
而”new(std::nothrow)”在分配内存失败时会返回一个空指针。

LOG(FATAL) 日志级别

log4j 定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。

  1. ALL 最低等级的,用于打开所有日志记录。
  2. TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。
  3. DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
  4. INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
  5. WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
  6. ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
  7. FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
  8. OFF 最高等级的,用于关闭所有日志记录。

如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来

log4j 默认的优先级为ERROR

"箭头(->)"和"点号(.)"操作符的区别

箭头(->):左边必须为指针;
点号(.):左边必须为实体。
class A
{
public:
	int a = 0;
};
int main()
{
	A b;
	A *p = &b;
	b.a; //类类型的对象访问类的成员
	p->a; //类类型的指针访问类的成员
}

参考:c++中“箭头(->)”和“点号(.)”操作符的区别

分割字符boost::split

用特定分隔符分割字符串,划分为一个字符串数组

格式:

boost::split( destination, source, boost::is_any_of( " ,!" )
//(destination)是用来存储分割的结果的容器
//(source)是要切割的內容
//(boost::is_any_of( " ,!" ))切割条件

参考:https://blog.csdn.net/sxj731533730/article/details/73740258

::前面什么都不写

在C++中::是域操作符,前面什么都不写代表的是全局函数,此函数不属于某个特定的类。如果::前面加了类名就代表函数是一个类独有。

参考:https://blog.csdn.net/wk_bjut_edu_cn/article/details/79620622

继承与类访问修饰符

数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。

继承,有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。

1. public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private

2. protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private

3. private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private

但无论哪种继承方式,上面两点都没有改变:

1. private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;

2. protected 成员可以被派生类访问。

类继承时不显示声明是 private,protected,public 继承,则默认是 private 继承,而在 struct 中默认 public 继承

参考:https://www.runoob.com/cplusplus/cpp-class-access-modifiers.html

类构造函数和析构函数

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。

  1. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。

  2. 默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值。

类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。

  1. 析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

参考:C++ 类构造函数 & 析构函数

重载操作符

C++ 输入/输出运算符重载

C++的编译过程

参考:

  1. 如何编译和运行C++程序?

  2. C++的编译过程及原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值