python 基础语法笔记

c++基础语法

引用和指针

引用是个标识符,不是对象;指针是一个对象,有值有地址,它的值就是某个对象数据的地址;

1
2
3
int a = 3;
int *p = a;
int* &rp = p;

上述代码最后一行是一个指向int类型指针的引用。

  1. int* & rp: 这里rp是一个引用,引用一个指向int类型的指针。可以将其读作"rp是一个对指向int的指针的引用"。
  2. =: 这是一个赋值运算符,用于将右侧的值赋给左侧的变量。
  3. p: p是另一个指向int类型的指针。

note:没有指向引用的指针,因为引用不是对象,没有地址之类的东西。

参考:https://www.zhihu.com/question/37608201

模版类和模版函数

模版这个语法是用来提高代码的可重用性,减少开发的代码量和工作量。

参考:

  1. https://zhuanlan.zhihu.com/p/101898043
  2. https://juejin.cn/post/7078530622527897631

const 修饰符

在函数后面加上const的作用?(常量成员函数)

参考:

https://zhuanlan.zhihu.com/p/94868121

在这个函数声明中,const关键字用于修饰成员函数。它表示该成员函数是一个常量成员函数,也称为常量方法。常量成员函数是在类中声明为const的成员函数。

常量成员函数有以下特点和作用:

  1. 不修改对象的状态:常量成员函数承诺在函数体内不会修改对象的任何数据成员。它们只能调用对象的其他常量成员函数,或者读取对象的数据成员,但不能修改它们。

  2. 适用于常量对象:常量成员函数可以在常量对象上调用。常量对象是通过const关键字修饰的对象,它的数据成员是不可修改的。常量成员函数允许在这些常量对象上进行操作,因为它们不会改变对象的状态。

  3. 增加对象的可访问性:将成员函数声明为常量成员函数可以使其在常量对象上可访问。这样,即使对象是常量,仍然可以调用该成员函数,而不会违反对象的常量性。

在你提供的函数声明中,get_val被声明为一个常量成员函数。这意味着在函数体内,get_val不会修改对象的任何数据成员。它可以被常量对象调用,并且不能调用其他非常量成员函数(除非它们也被声明为常量成员函数)。

以下是一个示例,展示了常量成员函数的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyClass {
public:
int get_val(int a, int b) const {
// 不修改对象的数据成员
// 可以读取数据成员和调用其他常量成员函数
return a + b + constantValue;
}

private:
int constantValue = 42;
};

int main() {
const MyClass obj; // 声明一个常量对象

int result = obj.get_val(10, 20); // 在常量对象上调用常量成员函数

return 0;
}

在上述示例中,get_val函数被声明为常量成员函数,并在常量对象obj上进行调用。函数体内不修改任何数据成员,只是读取了数据成员constantValue的值,并进行了计算。因为get_val是常量成员函数,所以可以在常量对象上调用它,而不会违反对象的常量性。

声明与定义

参考:

https://zhuanlan.zhihu.com/p/74528787

函数指针

参考:

https://www.runoob.com/w3cnote/cpp-func-pointer.html

回调函数

参考:

https://www.cnblogs.com/zzw19940404/p/14152151.html

https://blog.csdn.net/weixin_41605937/article/details/120248917 python的回调函数的讲解

typedef

typedef void (*FunctionPtr)(int);// 将函数指针类型定义为 FunctionPtr,它指向一个接受 int 参数且返回 void 的函数

上面这个函数指定的别名,名字在中间,和正常的不太一样。

多态 virtual

参考:https://zhuanlan.zhihu.com/p/37340242

lambda表达式

参考:https://www.cnblogs.com/DswCnblog/p/5629165.html

Const 与指针

代码:

luo机器上的/mnt/disk_drive/2022-JianYang/cpp_projects/cpp_basicconst_point.cpp

参考:

https://www.cnblogs.com/lihuidashen/p/4378884.html

void*指针

void*指针可以指向任意类型的数据。

大部分情况下,void*都是作为函数的一个参数,这个时候不是说你可以传递各种数据类型,比如intlongdouble之类的,而是你必须传递int*,long *之类,就还是必须要传递指针进来。

参考:

https://blog.csdn.net/bzhxuexi/article/details/17276675

https://zhuanlan.zhihu.com/p/98061960

c++中的cancellation point

在 C++ 中,Cancellation Point(取消点)是指某些特定的函数调用,它们在执行期间可以响应取消请求。取消请求是一种通知线程取消或终止其当前任务的机制。

当线程在执行某个函数时,如果遇到取消点,它会检查是否存在取消请求。如果存在取消请求,线程将执行取消操作,中断当前任务的执行,并根据具体情况采取相应的处理措施。这可以是线程退出、执行清理操作或进行其他适当的处理。

Cancellation Point 的存在是为了支持线程的取消机制,它允许外部实体(如另一个线程或信号处理程序)向执行中的线程发送取消请求,并在适当的时机进行响应。这对于长时间运行的任务或需要及时取消的任务非常有用,以避免资源浪费或无限期地等待。

在 C++ 标准库中,一些函数被指定为取消点,这意味着它们在执行期间会响应取消请求。这些函数包括 I/O 操作、线程相关的函数、互斥锁和条件变量相关的函数等。具体的取消点函数取决于实现和操作系统,可以在 C++ 标准库的相关文档中找到。

需要注意的是,并非所有的函数调用都是取消点。在 C++ 中,取消点的位置是由实现定义的,并且可能因操作系统、编译器或库的不同而有所变化。因此,在编写多线程应用程序时,应该了解哪些函数是取消点,并在必要的情况下进行适当的处理,以确保取消机制的正确运行。

总而言之,Cancellation Point 是指那些可以响应取消请求的特定函数调用,在 C++ 中用于支持线程的取消机制。(来自chatgpt的回答)

namespace是什么?

是c++的关键字,它可作为附加信息来区分不同库中相同名称的函数、类、变量等

参考:https://www.runoob.com/cplusplus/cpp-namespaces.html

智能指针

智能指针和RAII技术是相同的功能,都是让操作系统管理资源占用空间释放的。

内存布局

c++ static 关键字

参考:https://zhuanlan.zhihu.com/p/37439983

c++的异常处理

c++ explicit关键字

参考:https://www.cnblogs.com/rednodel/p/9299251.html

c++ errno用法

参考:https://blog.csdn.net/u011866460/article/details/40888943

linux cron 定时器

参考:

https://www.runoob.com/w3cnote/linux-crontab-tasks.html

c++ std::function用法

#define 宏的使用

参考:https://zhuanlan.zhihu.com/p/406699187

c++ ACM 输入输出

参考:

https://blog.csdn.net/weixin_44966641/article/details/122247439

https://zhuanlan.zhihu.com/p/494535515

stat结构体的作用

在 C++ 中,stat 结构体是用于获取文件或文件夹的元数据信息的结构体。它定义在 <sys/stat.h><sys/types.h> 头文件中,提供了一些字段来描述文件的属性。

以下是 stat 结构体的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct stat {
dev_t st_dev; // 文件的设备 ID
ino_t st_ino; // 文件的 i-node 号
mode_t st_mode; // 文件的类型和权限
nlink_t st_nlink; // 文件的硬链接数
uid_t st_uid; // 文件的所有者 ID
gid_t st_gid; // 文件的所属组 ID
dev_t st_rdev; // 特殊文件的设备 ID
off_t st_size; // 文件的总大小(以字节为单位)
blksize_t st_blksize; // 文件系统 I/O 缓冲区的块大小
blkcnt_t st_blocks; // 文件所占用的磁盘块数量
time_t st_atime; // 文件的最后访问时间
time_t st_mtime; // 文件的最后修改时间
time_t st_ctime; // 文件的最后状态更改时间
};

在使用 stat 结构体之前,需要包含相应的头文件,并通过调用 stat 函数来填充该结构体。例如,可以使用以下代码获取文件的元数据信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <sys/stat.h>
#include <unistd.h>

int main() {
struct stat fileStat;
const char* filePath = "path/to/file";

if (stat(filePath, &fileStat) == 0) {
// 访问文件的元数据信息
// 可以使用 fileStat 中的字段获取相应的信息
std::cout << "File Size: " << fileStat.st_size << " bytes" << std::endl;
std::cout << "Owner ID: " << fileStat.st_uid << std::endl;
// 其他字段...

} else {
// 处理获取元数据信息失败的情况
std::cerr << "Failed to get file metadata" << std::endl;
}

return 0;
}

在上述代码中,我们定义了一个 struct stat 类型的变量 fileStat 和一个文件路径 filePath。然后,通过调用 stat 函数并传递文件路径和 fileStat 变量的地址,可以获取文件的元数据信息。接下来,我们可以使用 fileStat 中的字段来访问相应的信息,例如文件大小 (st_size)、所有者ID (st_uid) 等等。

请注意,stat 函数返回 0 表示成功获取文件的元数据信息,否则返回 -1 表示失败。在失败的情况下,你可以根据具体的需求进行错误处理。

希望这个解释能帮助你理解 stat 结构体在 C++ 中的用法。如果你有任何进一步的问题,请随时提问。

sizeof的使用,与strlen的区别

sizeof对对象或表达式进行计算字节数;strlen统计字符串的字符个数;

sizeof不对传进来的表达式进行计算,只会评估这个表达式的类型,计算其类型的字节数。

例子:

1
2
3
char arr[10] = "hello";
cout << sizeof(arr) << endl; // 计算的arr是一个指针,返回指针大小,8个字节
cout << strlen(arr) << endl; // 计算的是字符串数组的长度,5个

c++可变参数

参考:https://zhuanlan.zhihu.com/p/104450480