- 博客(17)
- 收藏
- 关注
原创 C++ main函数全解
char* argv[]:同时也可写作char** argv,这是一个指针数组,实际长度为argc+1,但是最后一位保证是空指针来确保数组结束,有这个性质,argv的长度也可不依赖与argc的大小。int argc:一个非负数,表示传入的参数的个数,例如我有一个名字未:test.exe,在命令行中输入命令:text arg1 arg2 arg3,那么我在main函数内,检查argc参数的值为3。2.void wmain(){函数体}/int wmain(){函数体}/int。四、main函数的参数解释。
2024-01-21 12:35:53
1647
原创 SWUSTOJ解题 0001:Satellite Photographs
2.遍历photo的每个元素,检查这个元素的最大连通个数,这也是本题目的关键所在,其实可以想到,对于每个元素,都要看周围的元素是否满足相同的条件,然后递归这个过程,所以能够想到使用深度遍历/广度遍历的方式解决。本题的意思就是说,给出了一个二维矩阵,然后矩阵由“.”和“*”组成,题目问上下左右最多有多少个“*”是连通的,最大连通数就是我们要求的,但是一个int类型。1.使用一个二维矩阵photo存储所有的“*”和“.”
2023-12-24 23:14:23
468
原创 「Effective C++」条款13: 以对象管理资源
是一种独占式智能指针,只能有一个指针指向它所拥有的对象,当指针被销毁时,它所拥有的对象也会被销毁。可以转移拥有权,即将一个对象的拥有权转移给另一个对象或者一个原始指针。是一种共享式智能指针,多个指针可以指向同一个对象,当最后一个对象被销毁时,才会销毁所拥有的对象。内部维护了一个引用计数器,用于记录有多少个对象指向同一个对象。
2023-06-05 15:01:14
154
原创 C++ auto详解以及常见使用场景
序言:在C++11引入的关键字auto用于进行类型推导,即根据变量的初始化表达式自动推断变量的类型。使用auto关键字可以简化代码并提高代码的可读性。
2023-06-05 11:39:36
5099
1
原创 「Effective C++」条款12: 复制对象时勿忘其每一个成分
拷贝构造函数 + 赋值运算符重载函数 = copying函数。赋值运算符重载函数=copy assignment操作符。拷贝构造函数=复制构造函数=copy构造函数。
2023-06-02 16:41:10
96
原创 C++中的NULL和nullptr
nullptr是一个关键字,是一个特定的空指针常量,它的类型是nullptr_t,可以隐式转换为任何指针类型。:NULL是一个宏定义,通常被定义为整数0。它被视为整数类型,并且可以隐式转换为指针类型。**可能会导致意外的类型转换和错误,因为它实际上是整数0,可能与整数类型发生混淆。提供更好的类型安全性,因为它是一个明确定义的空指针常量,不会与其他类型发生混淆。在C++中,NULL和nullptr都用于表示空指针,但它们有一些重要的区别。是一个指针,那么两个重载的。 但是为什么在平常。
2023-06-01 14:34:41
831
原创 C++ 字符串原始字面量
在C++中,字符串原始字面量(raw string literal)是一种特殊的字符串表示方式,用于方便地表示包含转义字符和特殊字符的字符串,而无需使用额外的转义。是使用字符串原始字面量表示的字符串,不会解释其中的转义字符。是使用定界符的字符串原始字面量示例。是常规字符串,包含了转义字符。不会包含在字符串值中。
2023-06-01 14:08:47
505
原创 「Effective C++」条款11:在operator= 中处理“自我赋值”
注意,在我们日常的编码过程中,一般不需要按照本文的方式来做什么事,因为本节属于编译器自动生成的默认函数的范围,编译器会帮我们做好安全方面的问题,但是由于我们知道如果你自己显式的写了相关的函数,编译器就不再自动的生成,所以如果你写的函数版本有错误,可能会导致本节所提到的问题,解决方式请参照本文内容。指针指向的地址,来释放内存,否则会内存泄漏,正是因为这个这个delete,导致了问题。可见并不是我们所期望的那样,因为这个自我赋值,把原本的值也删除了。是一个指针,要把这个指针赋予新的地址,就必须先释放这个。
2023-06-01 10:58:41
161
原创 「Effective C++」条款10: 令operator=返回一个reference to *this
参考文章:(https://blog.youkuaiyun.com/u014038273/article/details/75426041)书中说明:“为了实现连锁赋值,赋值操作符必须返回一个reference指向操作符的左侧实参”。这代码是正确的,但是如果你有一个类,需要在类对象之间连锁赋值,就必须遵守这句书中说明。可见采用值作为返回值和引用作为返回值输出结果并没有什么区别,都能正确的在对象之间进行赋值。使用引用方式进行赋值速度更快,使用值赋值的方式需要创建临时对象,速度慢一点。输出结果:a,b,c的值相同。
2023-05-30 09:46:34
168
1
原创 「Effective C++」条款09: 绝不在构造和析构过程中调用virtual函数
正如第一点所分析的,构造函数的调用顺序是先基类的构造函数,再调用子类的构造函数(易错点:只有子类的构造函数调用的时候,子类的对象才会存在),所以当调用基类的构造函数的时候,子类的对象并不存在,既然子类的对象不存在,那么也就无法调用子类的虚函数。 同理,按照析构的顺序,会先调用子类的析构函数,此时子类的资源都没了,所以没法调用子类的虚函数,接着调用父类的析构函数,此时父类的析构函数所调用的就是父类自己的虚函数。声明了一个子类的对象,所以按道理应该调用的是子类重写后的虚函数,即输出。
2023-05-29 18:35:21
100
1
原创 「Effective C++」条款07: 为多态基类声明virtual析构函数
输出结果图:-----证明当父类的析构函数没有virtual关键字的时候子类的析构函数没有被正确调用。2.既然有内存的申请,就必须有内存的释放,释放使用关键字。观察以上代码,应该思考为什么基类的析构函数加上了关键字。输出结果图:可以看到两个子类的析构函数被调用。在堆上分配内存,堆上的内存需要程序员申请。3.关于多态基类为什么需要使用。关键字,正是和内存释放有关。
2023-05-29 17:44:06
157
1
原创 「Effective C++」条款06: 若不想使用编译器自动生成的函数,就该明确拒绝
优点:操作简单,能够应付大多数场景缺点:友元依旧可以操作定义为private的成员函数,或者使用公共成员函数也可以调用声明为private的成员函数public:private:Student(const Singleton& obj){} //声明为private,并定义为空来防止拒绝使用这两个函数。
2023-05-25 14:21:24
169
1
原创 「Effective C++」条款05: 了解c++默默编写并调用了哪些函数
析构函数不是用来销毁对象的,而是在编译器销毁对象的时候自动调用析构函数来清理资源的;作为基类的时候析构函数加virtual关键字,子类才能够销毁对象时释放资源;取地址重载和const取地址重载:一般不单独考虑。不涉及资源的释放可以不写;析构函数不可以重载;
2023-05-24 10:43:25
187
1
原创 「Effective C++」条款04: 确定对象被使用前已先被初始化
成员变量的声明顺序可以不和初始化列表写的顺序相同,但是实际上初始化顺序还是按照声明顺序进行的,不过请按照声明顺序书写初始化列表。第一种方式(在构造函数函数体内进行初始化),这种方式,首先。内存的是脏数据,并不清楚具体的值,所以操作未知的值会引发意想不到的状况,为此,我们使用对象前需要进行初始化。 虽然对于内置类型,两种方式的效率几乎相同,但是为了统一,建议还是都使用初始化列表的方式进行初始化。 ·首先看不推荐的初始化方式(记住C++规定对象的成员变量初始化动作发生在进入构造函数本体之前)
2023-05-23 16:22:17
97
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人