Joe1sn's Cabin

【置顶】【C++】开发笔记

c++实战遇到的一些坑,记录一下挺有意思的

vscode鼠标拖动代码页分栏失效/没反应

img

环境:windows

解决方法:cmd+shift+p 运行两次 Developer: Toggle Screencast Mode

if-else与++i --i

img

if最好先把else也写上,i++是语句结束后i+1++i是立即加

左值与右值

左值:表达式左边的值,可以被查找到地址的、持久存在的值

右值:字面量,或者std::move后的左值

左值引用:就是变量的别名

image-20250310214208773

右值引用:绑定到临时、即将销毁的对象,使用方法int &&right。意义就是避免内存操作

构造函数

构造函数就是一个类初始化的时候所需要的函数,主要分为以下几类

  • 默认构造函数
  • 带参数的构造函数
  • 拷贝构造函数:可以实现对象的深拷贝和浅拷贝,省略&会导致无限递归
  • 移动构造函数:接受一个右值引用(std::move
  • 转换构造函数
  • 委托构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Base {

public:
int val;

//默认构造函数
Base():val(int(0)) {
std::cout << "默认构造函数. value is " << this->val << std::endl;
}

//带参数的构造函数
Base(int v):val(v) {
std::cout << "带参数的构造函数. value is " << this->val << std::endl;

}

//拷贝构造函数
Base(const Base& other): val(other.val) {
std::cout << "拷贝构造函数. value is " << this->val << std::endl;
}

//移动构造函数
Base(Base&& other) noexcept: val(other.val) {
other.val = 0xFF;
std::cout << "移动构造函数. value is " << this->val << std::endl;
}

//转换构造函数
explicit Base(double v): val(static_cast<int>(v)) {
std::cout << "转换构造函数. value is " << this->val << std::endl;
}

//委托构造函数
Base(char v) : Base() {
this->val = v;
std::cout << "委托构造函数. value is " << this->val << std::endl;

}


~Base() {};
};

int main() {
Base a; //默认
Base b(1); //带参数
Base c(b); //拷贝
Base d(std::move(b)); //移动
Base e(3.124); //转换
Base f('A'); //委托

return 0;
}

image-20250310213435929