随笔
目录
头文件""与<>的区别
使用“”是搜索所有目录
使用<>是搜索当前目录
正常情况下,自行定义的头文件应该用"",因为这些文件放在工程目录(也就是编译器的当前目录)下,而不是放在公共头文件目录下,如果用<>则找不到头文件。
而系统提供的头文件,比如库函数的头文件,可以用<>。
[建议]:系统库使用 #include <>,其他库使用 #include “”
#pragma once
#pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。
namespace 命名空间
typedef vs #define
#define 是用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
- typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
- 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。
- ALL 最低等级的,用于打开所有日志记录。
- TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。
- DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
- INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
- WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
- ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
- FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
- OFF 最高等级的,用于关闭所有日志记录。
如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来
log4j 默认的优先级为ERROR
"箭头(->)"和"点号(.)"操作符的区别
箭头(->):左边必须为指针;
点号(.):左边必须为实体。
class A
{
public:
int a = 0;
};
int main()
{
A b;
A *p = &b;
b.a; //类类型的对象访问类的成员
p->a; //类类型的指针访问类的成员
}
分割字符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
类构造函数和析构函数
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
-
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。
-
默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值。
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。
- 析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
重载操作符
C++的编译过程
参考:
本文深入探讨C++编程的关键概念,包括头文件引用区别、命名空间管理、类型定义、内存管理、日志级别理解、操作符重载及编译流程解析。
734

被折叠的 条评论
为什么被折叠?



