![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习笔记
PengQ1
一枚基本功不扎实的不合格码农
展开
-
C++为什么要用传引用常量替换传值
优势1 效率高假设现在有一个Person类作为基类,还有一个Student类继承自Person,如下:class Person {public: Person(); virtual ~Person(); // 最好把基类的析构函数加上virtualprivate: std::string name; std::string address;};class Student : public Person {public: Student();原创 2020-05-26 10:31:37 · 344 阅读 · 0 评论 -
C++为什么要尽可能地使用const(Effective C++)
当const遇见指针(常量指针与指针常量)国内的很多教材、教程里常常提到常量指针和指针常量,很多公司面试的时候也会问到区别。乍一看好像很绕,其实也不难,下面的例子将具体的讲解一下。char greeting[] = "Hello";char* p = greeting; // non-const pointer, non-const dataconst char* p = greeting; // non-const pointer, const原创 2020-05-25 17:50:06 · 443 阅读 · 0 评论 -
C++内联函数inline
内联函数定义与使用常规函数的调用过程 编译过程的最终产品是可执行程序–由一组机器语言指令组成。运行程序时,操作系统将这些指令载入到计算机内存中,因此每一条指令都有特定的内存地址。有时,比如说遇到循环或者判断语句,会跳过一些指令,向前或向后跳到特定的地址。常规函数调用也使得程序跳转到下一个地址–函数的地址,并在函数结束时返回。 更具体的过程是执行到...原创 2020-03-08 10:47:33 · 946 阅读 · 0 评论 -
C++ const用法
const限定符在变量前面加上const,也可以创建一个常量。使用const创建常量的一般格式如下:const type name = value;使用const的时候应该注意在声明中对const变量进行初始化。const int toes;toes = 10;以上用法是错误的,会带来编译错误。如果常量在声明的时候没有提供值,则该常量的值将是不确定的,且无法修改。常量...原创 2020-03-07 09:55:00 · 380 阅读 · 0 评论 -
C++名称空间(namespace)
前言当随着C++项目项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如,两个类库可能都定义了名为List, Tree和Node的类,但定义的方式不兼容。用户希望使用其中一个库的List类,而使用另一个库的Tree类。这种冲突就被称为名称空间问题。A demo for namespacenamespace Jack { double pail...原创 2020-03-03 09:50:35 · 909 阅读 · 0 评论 -
C++ 如何避免一个头文件被include多次
同一个文件中只能将一个头文件include一次。记住这个规则很容易,但是很可能在不知情的情况下将头文件包含多次,因为你include的头文件里可能还会include其它的头文件,这样层层嵌套,很容易出现上面的问题。这时就会带来编译的错误。C/C++中有一种标准的技术可以有效避免多次include同一个头文件,即预编译指令#ifndef(if not defined)。例如对于我们定义的头文件&...原创 2020-03-02 20:28:39 · 4721 阅读 · 0 评论 -
C++ 全局变量链接性、extern、static关键字
单定义原则、外部变量与externC++有“单定义原则(One Definition Rule, ODR)”, 该规则决定了任何变量都只能有一次定义。为了实现这种需求,C++提供了两种变量声明。一种是定义声明(definition declaration),或者简称为定义(definition),它给变量分配存储空间;另外一种是引用声明(referencing declaration),或者简...原创 2020-03-02 19:58:10 · 967 阅读 · 0 评论 -
C++ 拷贝构造函数浅析
什么是拷贝构造函数:拷贝构造函数,顾名思义,就是在拷贝的时候调用的构造函数。几个原则:C++ primer p406 :拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。C++支持两种...原创 2020-03-01 03:30:48 · 178 阅读 · 0 评论 -
C++中static_cast, const_cast, reinterpret_cast, dynamic_cast的区别
C++中存在显示转换和隐式转换,所谓隐式转换即是比如int和float相加时,int会自动转换成float,此外还有显示转换,共有四种转换方法, static_cast, const_cast, dynamic_cast, reinterpret_cast隐式转换一般都是比较安全的,而且C中的类型转换一般通过()来实现,C++之所以将它们变成四个关键字有以下两个原因,程序中存在大量的(),...原创 2020-03-01 03:25:45 · 178 阅读 · 0 评论 -
C++中NULL和nullptr的区别
前言C和C++的变量名是对大小写敏感的,因此NULL和null并不是一回事,前者是C/C++中的系统关键字,null并不是。C++11以后又引入了nullptr,用以解决NULL在隐式转换和作为函数传入参数时的二义性问题。在C++11以前,在C/C++语言中,我们常常用NULL作为指针变量的初始值。而在C++11之后,却不建议你这么做。其实NULL根据命名全大写可以看出来,它是一个常量...原创 2020-03-01 03:22:41 · 803 阅读 · 0 评论 -
堆与栈,深拷贝与浅拷贝的区别
内存区域结构: Memory ------------------ | Heap | |------...原创 2019-11-01 17:04:51 · 694 阅读 · 0 评论 -
C++的传值、传引用、传指针
有时候我们在编写函数时,常常会为一个现象感到费解。比如,编写一个交换a和b的值的函数,函数体里面确实是把a和b的值交换了,但是执行完毕之后,输出a和b的值,却发现依然是原来的值。传值:#include<iostream>using namespace std;void swap(int a,int b) { int t = a; a = b; b = t;}...原创 2018-10-18 10:43:12 · 251 阅读 · 0 评论 -
C++类实例化方式
C++中,实例化方式一般有两种:1,直接定义对象,这时成员变量需要通过 ‘.' 来访问,如 A a;2,定义一个类指针,这时需要用到new方法,如 A *a = new A。访问类的成员函数或者说是成员变量需要通过 ‘->’。但是这个时候,当对象使用完成之后,需要使用delete [] a;把该指针删除。怎样选择:二者的内存分配方式也不一样,前者在堆栈中分配内存,后者动态分配...原创 2018-10-16 16:26:22 · 2065 阅读 · 0 评论 -
C++中的内联函数(inline)与宏定义
为什么要使用内联函数呢?当我们定义完一个函数之后,实际调用的时候,函数体本身会压入堆栈,主函数再从堆栈里面把这部分内容提取出来,产生一定的系统开销,对于大型函数来说,这部分开销可能相对于函数体本身执行的开销来说微乎其微。但是如果一个函数仅仅只是为了完成一个特别简单的功能,比如交换两个变量的值,亦或是求两个变量的最大值,这时,调用函数的开销,可能就会大于函数体执行本身了。作为一个追求高性能的程序...原创 2018-10-18 11:45:33 · 528 阅读 · 0 评论 -
C++内存分配方式-堆、栈、静态存储区、常量存储区
C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。自由存储区:是由malloc等分配的...原创 2018-10-19 14:44:10 · 500 阅读 · 0 评论 -
C++\Linux\网络 常见面试题汇总
以下是面试一家外企的C++软件开发时的面试题汇总。Part1:C++语言特性:1,C++里面类的static成员变量有什么特点?static成员变量,是独立于类对象存在的,是与类绑定在一起的一个概念,存储区域在静态存储区。该变量的初始化只能在类外进行。比如说,某个person类有一个static的nation变量,虽然,这个类可能定义1000个person的对象,但是,他们的国籍是一样...原创 2018-11-30 12:10:00 · 378 阅读 · 0 评论 -
C++内联函数(inline)
1,为什么要使用内联函数?内联函数并不是什么高大上的概念,如果学过C语言的同学,一定知道C语言中的宏定义(#define),内联函数的作用与宏非常类似。当C++的代码执行到某一个函数的时候,会记录该处的地址。然后,去内存中找到对应函数定义所在的代码段,将实参复制到堆栈之中,随后执行相应的函数代码,执行完之后再返回之前保存的地址。这整个过程称为一次函数调用。如果个别的函数被调用的次数很多,而...原创 2019-07-15 17:39:04 · 144 阅读 · 0 评论 -
深入剖析C++中的引用变量(&)
1,函数的参数传递方式1️⃣实参和形参函数的参数分为形参(parameters)和实参(arguments)。在阅读英文注释或者查看英文网站的时候,可能常常会遇到这两个单词,应当知晓它们的区别。前者是在函数定义的时候采用的变量名,并没有什么实际的意义。后者则是在函数调用的时候实际传入的参数。2️⃣值传递、指针传递与引用传递函数的参数传递方式可以分为值传递、指针传递和引用传递。若...原创 2019-07-15 18:25:19 · 398 阅读 · 0 评论 -
C++中的“&”的用法
“&”作为逻辑运算符以及作为位运算符的功能此处不再赘述。1,取址int *p = &a;这里的p里面存储的就是变量a的地址。2,引用int &b = a;此时b就是a的引用,或者称之为别名。如果修改b的值,那么a的值也会相应地发生改变。如b=1,那么a也就会跟着等于1。这种方式在函数传参的时候很常见,如果想函数执行完改变原参数的值,就应该在传参的...原创 2018-10-18 11:03:09 · 6290 阅读 · 0 评论