C++学习
OOP——C++遇到的小坑
HW3 Personal Diaray
- 重定向到文件时,需要
cin.clear()
,详见Diary.cpp
中的Read_Diary
函数 - 字符串格式
path
被freopen
使用时要加入path.cstr()
,详见pdadd.cpp
中的path
调用
HW6 Vector
- 类模板编写的时候,成员函数的实现要写在测试函数中(类模板,是不支持,声明,定义,测试分开写的,会出现链接编译错误)
ref:https://blog.csdn.net/weixin_45031801/article/details/134358472 malloc
和remalloc
的使用方便了动态申请数组,解决了数组超限的问题
MiniSQL
6-RECOVERY MANAGER
map相关
- first,second变量
c++ 里面的map容器的迭代器first、second用法
例:
map<string, int> m_stlmap;
m_stlmap[“xiaomi”] = 88;
auto mpit = m_stlmap.begin();
first会得到Map中key的有效值,
second会得到Map中value的有效值。
所以
mpit ->first; // 得到是 string 值是 “xiaomi”
mpit ->second; //得到是 int 值是 88
对于unordered_map亦是如此
begin(),end()
在C++中,std::map是一个关联容器,它提供了一种键-值对的存储方式,并按照键的排序顺序进行自动排序。map类提供了一系列的成员函数,其中包括begin()和end()函数,用于获取指向map容器中第一个元素和最后一个元素之后位置的迭代器。- map::begin()函数
1
2iterator begin();
const_iterator begin() const;
这个函数返回一个指向map容器中第一个元素的迭代器。如果map为空,返回的迭代器等于end()函数返回的迭代器,表示指向map容器的末尾。
例如:
1
2
3std::map<int, std::string> myMap;
// 添加一些元素到myMap中
std::map<int, std::string>::iterator it = myMap.begin();
在这个例子中,it是一个指向myMap中第一个元素的迭代器。- map::end()函数 这个函数返回一个指向map容器中最后一个元素之后位置的迭代器,也就是尾后迭代器。尾后迭代器不指向具体的元素,而是表示map容器的末尾。
1
2iterator end();
const_iterator end() const;
例如:
1
2
3std::map<int, std::string> myMap;
// 添加一些元素到myMap中
std::map<int, std::string>::iterator it = myMap.end();
在这个例子中,it是一个指向myMap中最后一个元素之后位置的迭代器,表示尾后迭代器- map::begin()函数
insert 和 emplace
参考博客
- first,second变量
共享指针相关
1
2
3
4//调用拷贝构造函数
std::shared_ptr<int> p4(p3);//或者 std::shared_ptr<int> p4 = p3;
//调用移动构造函数
std::shared_ptr<int> p5(std::move(p4)); //或者 std::shared_ptr<int> p5 = std::move(p4);如上所示,p3 和 p4 都是 shared_ptr 类型的智能指针,因此可以用 p3 来初始化 p4,由于 p3 是左值,因此会调用拷贝构造函数。需要注意的是,如果 p3 为空智能指针,则 p4 也为空智能指针,其引用计数初始值为 0;反之,则表明 p4 和 p3 指向同一块堆内存,同时该堆空间的引用计数会加 1。
1
std::shared_ptr<int> p3 = std::make_shared<int>(10);
同时,C++11 标准中还提供了 std::make_shared 模板函数,其可以用于初始化 shared_ptr 智能指针,例如:
注意,同一普通指针不能同时为多个 shared_ptr 对象赋值,否则会导致程序发生异常。
结构体构造函数相关
在C++中,结构体(struct
)和类(class
)在语法上非常相似,它们都可以拥有成员变量和成员函数,包括构造函数。结构体和类的主要区别在于默认的访问权限:结构体的成员默认是公共的(public
),而类的成员默认是私有的(private
)。以下是几种常见的构造函数写法:- 默认构造函数
不接收任何参数,用于创建对象时不进行任何初始化。
1
2
3
4
5struct MyStruct {
MyStruct() {
// 初始化代码
}
};- 参数化构造函数
接收参数,用于初始化对象的成员变量。
1
2
3
4struct MyStruct {
int x;
MyStruct(int val) : x(val) {} // 使用初始化列表
};- 带默认参数的构造函数
构造函数的参数有默认值,调用时可以不提供这些参数。
1
2
3
4struct MyStruct {
int x, y;
MyStruct(int x = 0, int y = 0) : x(x), y(y) {} // 默认参数和初始化列表
};- 委托构造函数(构造函数重载)
结构体可以有多个构造函数,它们可以调用其他构造函数来减少代码重复。
1
2
3
4
5struct MyStruct {
int x, y;
MyStruct(int x) : MyStruct(x, 0) {} // 委托给另一个构造函数
MyStruct(int x, int y) : x(x), y(y) {}
};- 复制构造函数
用于复制已有对象来创建新对象。
1
2
3
4struct MyStruct {
int x;
MyStruct(const MyStruct& other) : x(other.x) {} // 复制构造函数
};- 移动构造函数
用于移动资源,避免不必要的复制。
1
2
3
4
5
6struct MyStruct {
int* x;
MyStruct(MyStruct&& other) : x(other.x) { // 移动构造函数
other.x = nullptr;
}
};- 构造函数的组合
可以将多种构造函数的特性结合起来。
1
2
3
4
5
6struct MyStruct {
int x, y;
MyStruct() : MyStruct(0, 0) {} // 默认构造函数,委托给参数化构造函数
MyStruct(int x) : MyStruct(x, 0) {} // 单参数构造函数,委托给双参数构造函数
MyStruct(int x, int y) : x(x), y(y) {} // 参数化构造函数
};- 私有/受保护构造函数
限制构造函数的访问,通常用于单例模式或防止外部直接创建对象。
1
2
3
4
5
6
7
8
9struct Singleton {
Singleton() {}
// 私有构造函数,外部不能直接创建实例
};
struct ProtectedStruct {
protected:
ProtectedStruct() {} // 受保护的构造函数,只能在派生类中创建实例
};- 删除的构造函数(C++11及以后)
可以显式删除构造函数,使其不能被调用。
1
2
3struct MyStruct {
MyStruct() = delete; // 删除默认构造函数
};这些构造函数的写法可以根据需要进行组合和定制,以满足不同的初始化需求。
- 默认构造函数
C++短学期
EasyX库安装
OpenGL
对新手不太友好,我们这里选择EasyX
进行游戏设计
由于EasyX
安装只能识别VS,我们这里参考博客进行Clion
+EasyX
的环境搭配
参考博客: https://codebus.cn/bestans/easyx-for-mingw
文章中提到:
链接选项增加:-leasyx,这样可以在编译的时候链接 libeasyx.a 库文件。每个项目都要这样设置一次,然后编译即可。
我们这里使用Cmake
工具,避免使用了对于含EasyX
库的项目都要进行对编译链的修改。
1 | cmake_minimum_required(VERSION 3.27) |
cmake
参考博客: