![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
研究生生活——C++基础
C++基础知识总结
LikeMarch
不悲叹过去,不荒废现在,不惧怕未来。
展开
-
C++自己实现一个nullptr(转发)
2021年05月07日 周五 天气 小雨 【不悲叹过去,不荒废现在,不惧怕未来】本文目录自己实现一个nullptr(c++)转载 2021-05-07 10:37:57 · 100 阅读 · 0 评论 -
C++中static变量的初始化
2021年03月31日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 编译时初始化2 加载时初始化3 运行时初始化4 static初始化的原理总结1. 编译时初始化如果静态变量本身是基本数据类型(POD),且初始化值是常量,那么这个初始化过程是在编译期间完成的。static int a = 10;static char strArray[] = "hello! world";那么这个初始化过程是在编译期间完成的,这也就是通常所说的"编译时初始化"。2 加载时初始化程转载 2021-03-31 09:44:31 · 4371 阅读 · 1 评论 -
C++ 函数/模板的偏特化和全特化
2021年03月30日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】直接用代码来解释:#include <iostream>using namespace std; template<typename T, typename N>class Test{public: Test( T i, N j ) : a(i), b(j) { cout<<"普通模板类"<< a <<' ' <<转载 2021-03-30 21:49:11 · 138 阅读 · 0 评论 -
为什么C++是面向对象的语言?
2021年03月27日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】为什么C++是面向对象的语言?转载 2021-03-27 10:05:03 · 531 阅读 · 1 评论 -
数组指针和指针数组的区别
2021年03月16日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】数组指针和指针数组的区别转载 2021-03-16 16:15:13 · 62 阅读 · 0 评论 -
详解C++的模板中typename关键字的用法
2021年03月16日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】详解C++的模板中typename关键字的用法转载 2021-03-16 15:40:44 · 121 阅读 · 0 评论 -
++i 和 i++ 的实现(自定义MyInt类模拟)
2021年02月22日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】用MyInt类实现 ++i 和 i++。class MyInt{public: int value; //实际的value值 MyInt(int value){ //方便初始化:MyInt i = 0; this->value = value; } /** * 重写前置式++运算符(++i时会自动调用本函数)原创 2021-02-22 11:34:11 · 230 阅读 · 0 评论 -
关于C/C++是否支持定义不定长数组
2021年02月10日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】事实上,不定长数组的定义早在C的C99标准里就已经被提出,但是从来都没在C++标准(C++98、C++03、C++11)里存在过。因此,G++支持不定长数组完全是因为它同时支持C99和C++(对C99标准支持得最好的就是G++了),而VS不怎么支持C99标准那是人尽皆知的,也就理所当然不支持C99的不定长数组了。另外Turbo C 3.0不支持是因为它非常古老,本身就不支持C99。PS:目前没有编译器可以完全实现C99,而且为转载 2021-02-10 11:52:27 · 1001 阅读 · 0 评论 -
printf(str) 和 printf(str,%s) 的区别
2021年2月1日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】printf(str): 由于printf支持可变参数,所以后续变量的个数就需要通过str中的格式化串来确定。当str串中包含%s,%d,%c等格式化串时,printf就会去栈中找这个格式化串对应的变量,但实际上,根本没有向printf压入更多的参数,因此就会出现打印失败或者程序崩溃的现象,如下图所示:因此,在写代码的时候,一定不要用printf(str),老老实实使用printf(str,%s)。参考文献https://原创 2021-02-01 11:23:05 · 2510 阅读 · 0 评论 -
const char*、char const*、char* const 的区别
2021年2月1日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. const char* 和 char const* 等价2. const char* 和 char* const 区别1. const char* 和 char const* 等价C++标准规定,const关键字放在类型或变量名之前是等价的,因此const char*和char const*是等价的。const char *p; //same as belowchar const *q; 2. co原创 2021-02-01 10:34:58 · 261 阅读 · 0 评论 -
C++中内部链接和外部链接(关联问题:static、inline的作用;重定义问题;无法解析的外部符号;模板声明和定义为什么要写在一起)
2021年01月19日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文转载自:https://zhuanlan.zhihu.com/p/150001991 ,有改动。搞明白内部链接和外部链接,之前的很多问题诸如:static、inline的作用;重定义问题;无法解析的外部符号;模板声明和定义为什么要写在一起,都能比较容易理解了,以下是正文。1. 编译单元简单地,一个cpp文件就是一个编译单元。定义:当一个c或者cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单转载 2021-01-19 22:06:54 · 425 阅读 · 0 评论 -
C++中sizeof()和strlen()作用于char和string的区别
2021年01月15日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】从以下3个问题入手:问题一:sizeof()返回的长度包括’\0’吗?strlen()返回长度包括’\0’吗?sizeof()和strlen()的区别在哪里?问题二:char a[5]中能放5个字符吗?如果能放,’\0’ 哪里去了?char a[5]={‘a’,‘b’,‘c’,‘d’,‘e’} 成立吗?如果成立数组a中的结束符在哪里?问题三:char *b=“abcde”; 那b可以直接拷贝到一个char a[5原创 2021-01-15 16:02:53 · 241 阅读 · 0 评论 -
C++类的实例化加括号和不加括号的区别
2020年1月7日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】直接说结论吧:类本身带有无参构造函数,则实例化时,两种方法成员变量都会初始化。class Test{private: int m_Int; int *m_pInt; public: Test(){}}; int main(){ Test *t1 = new Test; //t1成员变量会初始化 Test *t2 = new Test(); //t2成员变量会初始化}类本身不带有无参构造函数,原创 2021-01-07 10:53:23 · 1346 阅读 · 0 评论 -
详解C/C++中struct/class的内存对齐规则
2020年12月8日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】确定一个结构体大小大致需要下面两个步骤即可步骤一:前面单元的大小必须是后面单元大小的整数倍,如果不是就补齐步骤二:整个结构体的大小必须是最大字节的整数倍首先看看空结构体,C++编译器会在空类或空结构体中增加一个虚设的字节,以确保不同的对象都具有不同的地址。struct A { }; cout<<"空结构体:"<<sizeof(struct A)<<endl;原创 2020-12-08 20:59:25 · 889 阅读 · 0 评论 -
类中的回调函数要加static的原因
作为一名初学者,一直困惑于回调函数在类中为何要加static。在深入浅出MFC中找到答案,留下笔记。如果一个callback函数是一个类成员函数,就要加上static,原因在于必须舍弃掉类成员函数的隐藏参数this指针 。比如一个callback函数被要求声明为以下形式:void CALLBACK function();如果这个函数在类ObjClass里面,编译器会为其添加一个this指针,用于指向调用该函数的对象。所以编译出来的代码是这种形式:void CALLBACK ObjClass::f转载 2020-12-07 20:20:23 · 758 阅读 · 0 评论 -
数组名a和&a的区别
这里我们先看看数组名代表的是什么,这个概念可能大家有所误解,认为数组名代表的就是数组的地址,当然,数组名代表的是一个地址,但是关键是,通过这个地址,我们关注的是它能取得多大空间的数据的值,例如对于一个char 类型的地址,我们能够取得一个字节的值,对于一个int型的地址,我们能够取得4个字节的值。这里我们以整形数组为讲解:int a[4];a是一个地址,我们知道a其实本来的面目应该是:a+0,只不过这个0我们就省了,*(a+0)是什么呢,这个代表的就是取得第一个元素的内容,也就是a[0],所以我们可转载 2020-12-07 18:40:33 · 423 阅读 · 0 评论 -
剑指offer 01. 赋值运算符函数(考虑异常安全)
2020年11月17日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】第一次写的时候,只写出了版本1的初级解法,看了书才知道要考虑异常安全,给出了高级解法,版本3的解法比较巧妙,要牢记。class CMyString {public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); CMyString& operator=(const CMyStr原创 2020-11-17 20:53:09 · 112 阅读 · 0 评论 -
C++实现字符串mystring类的封装(难点:赋值运算符函数)
2020年11月10日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 引言2. 主文件——main.cpp3. mystring.h4. mystring.cpp参考文献1. 引言用C++实现了简单的字符串类封装,实现了字符串赋值、相加、修改、比较等功能。完整工程放在了我的github上,有需要的也可以自取。github地址:https://github.com/March225/High-frequency-algorithm2. 主文件——main.cpp/** *原创 2020-11-10 12:21:57 · 903 阅读 · 0 评论 -
关于C++的cin的错误输入的问题以及解决办法
2020年11月9日 周一 天气晴【不悲叹过去,不荒废现在,不惧怕未来】转载:https://blog.csdn.net/silence1_/article/details/94722777先来一个简单的例子:int num_input;cin>>num_input;while(num_input<=0){ cout<<"请输入正数"<<endl; cin>>num_input;}cout<<num_input<&转载 2020-11-09 16:26:51 · 1881 阅读 · 0 评论 -
C++中如何使用new分配、delete释放多维动态数组
2020年9月17日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 一维数组2. 二维数组2.1 使用常量2.2 使用指针间接引用参考文献1. 一维数组一维动态数组的分配和释放比较简单int *dp = new int[10]; // 每个元素都没有初始化(值随机)int *dp = new int[10] (); // 每个元素初始化为0int *dp = new int[10] = {1}; // 初始化第一个元素为1delete[] dp; // 动态释放原创 2020-09-17 22:36:39 · 1705 阅读 · 2 评论 -
总结C++自定义比较函数(算法:sort,容器:priority_queue、map、set)
2020年9月10日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】题外话:今天是教师节,祝天下所有的老师节日快乐~~本文目录在使用STL中很多涉及比较的函数(比如:sort、priority_queue、map、set)的时候,我们都可以自定义比较函数,具体来说大致有下面几种方法:对一个自定义的 struct 重写它的 operator < 方法定义一个 cmp 函数定义一个 cmp 结构体对象lambda表达式...原创 2020-09-10 22:41:29 · 6922 阅读 · 3 评论 -
string中的 find_first_of 和 find_first_not_of
2020年9月9日 周三 天气小雨 【不悲叹过去,不荒废现在,不惧怕未来】find_first_of用法举例:s1.find_first_of(s2),意为:在s1中查找与s2中任意一个字符相等的第一个字符的索引。find_first_not_of用法举例:s1.find_first_not_of(s2),意为:在s1中查找与s2中任意一个字符都不相等的第一个字符的索引。...原创 2020-09-09 21:51:31 · 211 阅读 · 0 评论 -
总结C/C++变量的初始化规则
2020年8月11日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 内置类型变量初始化(类外)2. 类的成员变量初始化2.1 内置类型变量的初始化2.2 初始化顺序2.2.1 构造函数初始化列表2.2.2 构造函数赋值2.3 初始化优先级2.4 const、引用和未提供默认构造函数的类类型2.5 static静态变量3. 结语参考文献1. 内置类型变量初始化(类外)如果内置类型变量在定义时没有指定初值,会有以下两种可能:定义于任何函数体之外的变量被默认初始化为0。定原创 2020-08-11 22:30:59 · 683 阅读 · 0 评论 -
Doxygen风格的C++注释模板
2020年7月31日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】规范化的注释是十分重要的,基于Doxygen的C/C++注释原则标注总述1.文件头标注2. 命名空间标注3. 类、结构、枚举标注4. 函数注释原则5. 变量注释6. 模块标注7. 分组标注 总述华丽的分隔线//---------------------------------------------------------------------------// Platform Defines//-转载 2020-07-31 16:42:30 · 1888 阅读 · 0 评论 -
C++:const int*& 和 int* const& 以及 const int* const&
2020年7月30日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录大型翻车现场问题思考情况1. 指针的引用情况2. 指针常量的引用情况3. 常量指针的引用情况4. 指向常量的常量指针的引用参考文献大型翻车现场void print(const int*& a) { cout << *a << endl;}int main(){ int a = 10; int* p = &a; print(p);}翻车原因是我想传入一个指针,原创 2020-07-30 21:21:40 · 825 阅读 · 0 评论 -
C/C++命名规范
2020年7月28日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录一、用最短字符表示最准确的意义。二、使用变量前缀。三、类的成员变量以m_开头,后面为变量,变量同时还要加前缀。四、定义一个变量,为了简化,在不影响变量意义的情况下,可仅仅使用前缀。五、全局变量一律以g_开头,后面为变量,变量同时还要加前缀。六、定义结构体,保证C和C++兼容,采用typedef语句,并且结构体类型全部大写,以T_开头,指针形式以PT_开头。七、变量由多个单词组成,则每个单词的首个字母大写。八、定义一个类以C转载 2020-07-28 13:35:47 · 1524 阅读 · 0 评论 -
C++中输入方式总结:cin>>、cin.get()、cin.getline()、getline()、gets()和getchar()(附split的实现)
2020年7月27日 周一 天气阵雨 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 简单介绍输入缓冲区2. cin>>3. cin.get()用法1: a = cin.get()或cin.get(a)用法2:cin.get(arrayname,size)用法3:cin.get(arrayname,size,s)本文转载自 https://blog.csdn.net/livecoldsun/article/details/254894291. 简单介绍输入缓冲区程序的输入都建有一原创 2020-07-28 11:56:00 · 585 阅读 · 0 评论 -
C++substr()函数的用法
2020年7月25日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文标题最近在做LeetCode题目的时候,被substr()函数坑了一次,我本以为substr()的两个参数是返回这两个位置之间的字符串,其实并不是:s.substr(pos, n) // 截取s中从pos开始(包括0)的n个字符的子串,并返回s.substr(pos) // 截取s中从pos开始(包括0)到末尾的所有字符的子串,并返回示例代码:#include <string> #incl原创 2020-07-25 21:06:06 · 249 阅读 · 0 评论 -
C++11:右值引用、移动构造函数和emplace_back
1. 右值引用左值和右值的区别左值:有名字的变量(对象),可以被赋值,可以在多条语句中使用。右值:没有名字的临时变量(对象),不能被赋值,只能在一条语句中出现。左值引用右值引用2. 移动构造函数3. emplace_back...原创 2020-07-22 13:28:37 · 885 阅读 · 1 评论 -
关于C/C++有哪几个分区以及自由存储区和堆的区别
2020年7月15日 周二三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文标题一、网上搜索C++分区,会发现有两种不同的答案:1. 在C/C++中,内存分成5个区,他们分别是**堆**、**栈**、**全局/静态存储区**、**自由存储区**和**常量存储区**。2. 一个由C/C++编译的程序占用的内存分为以下几个部分——**堆**,**栈**,**全局/静态存储区**,**文字常量区**,**程序代码区**。二、查阅了一些资料,其中一个观点如下内存一共4个区:1. 任何在函数内部声明的非sta原创 2020-07-15 16:37:59 · 3057 阅读 · 1 评论 -
C++中的string与char[]、char*详解
2020年7月14日 周二 天气阴 【不悲叹过去,不荒废现在,不惧怕未来】关于C++里的字符串和字符数组以及字符指针,一直都搞不太明白,今天在这里做个总结,希望能彻底弄懂它们。C++中有两种风格的字符串:C-风格字符串C++引入的string类C风格字符串C-风格字符串起源于 C 语言,并在 C++ 中继续得到支持。C-风格字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。代码char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'原创 2020-07-15 12:29:35 · 22099 阅读 · 2 评论 -
C++比较两个字符串是否相等
2020年7月14日 周二 天气阴 【不悲叹过去,不荒废现在,不惧怕未来】今天在刷Leetcode的时候,遇到比较两个string是否相等的问题,在这里总结一下在C++里如果比较两个字符串是否相等(包含C风格字符串和string对象)。一、C风格字符串C风格字符串的比较使用的是strcmp()函数,原型如下:int strcmp(const char* s1,const char* s2)当s1<s2时,返回为负数;当s1==s2时,返回0;当s1>s2时,返回正数。比较的规则为原创 2020-07-14 12:02:14 · 15443 阅读 · 0 评论