- 博客(23)
- 收藏
- 关注
原创 C++ 高效编程:函数返回值避免reference与pointer案例
pass-by-value传值时会多调用了一次拷贝构造函数与析构函数,且当形参为非基本类型时,也将在栈区开辟更多的空间。因此,当定义的函数需要返回对象时,大部分人可能会想到以reference或pointer作为函数返回值,为了防止出错,以下几种情况不能作为函数返回值:1.函数内部使用new开辟的空间的reference:当被返回的函数的reference是函数内部使用new开辟的空间时,可能造成这个引用所指向的自由存储区无法释放的情况(由于外部没有具体的变量名,故无法用delete手动释放该内存),从
2022-03-14 20:09:27 4035
原创 C++ 高效编程:pass-by-value(值传递)与pass-by-reference(引用传递)
C++在定义函数传参时,常用pass-by-value(值传递)与pass-by-reference(引用传递)两种形式,两种参数传递具体实现方式为:值传递(pass-by-value)值传递(passl-by-value)过程中,在堆栈中开辟了形参内存空间,并调用拷贝构造函数把实参值复制给形参,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值,且实参到形参传值过程中调用了拷贝构造函数。例:#include <i
2022-03-14 15:58:12 3354
原创 C++ 高效编程:规范使用 == 判断符
在编程的过程中,经常会使用==与=两个符号,两符号不同于与数学运算符"=="与"=",在C++中,运算符“==”表示等一操作符,判断两边是否相等。利用相等运算符,如果希望相等运算符返回true,则运算符两侧的值或语句必须使相等的;如果不相等,则==运算符返回false。int c = 0;printf("%d \n", c==2);运行输出0int c = 0;printf("%d \n", c==0);运行输出1运算符“=”表示是赋值的意思,它的作用是将一个表达式(
2022-03-13 15:27:42 9023
原创 C++ 高效编码准则:1-7
目前,鉴于工作需求,为了提升自己的编码能力,与编码规范性。作者研究《Effective C++》一书,接下来将陆续做一些总结,与大家分享,供大家学习。1.C++语言已经是个多重范型的编程语言,C++语言可被看作一个语言联邦,四个次语言是:1)C;2)Object-Oriented C++;3)Template C++;4)STL。四个次语言进行高效编程时有各自的编程守则。2.少用define,尽可能使用const、enum、inline。宏定义实在预处理阶段被预处理器进行分析替换,宏定义的符号并不会
2022-03-06 20:52:05 621
原创 C++ define 与inline浅析
define用define 定义的常量:没有类型的不进行类型安全检查,可能会产生意想不到的错误,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define 所定义的宏变量在预处理阶段的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;用 define 可以定义一些简单的函数:宏替换只作替换,不做计算,不做表达式求解,不进行类型安全检查,会造成大量安全隐患。define定义简单函数隐患举例:输入变量不加括号#define SQUARE(X)
2022-03-04 15:13:39 3473
原创 C++ 自由存储区与堆
谈到自由存储区与堆的区别,就需要了解new与malloc的区别。实际上堆是C语言的关键术语,是操作系统所维护的一块特殊内存,它提供了动态分配的功能。用户使用malloc进行堆内存申请,使用free实现堆内存的释放。但自由存储区不同,它是C++中的一个抽象的概念。C++中规定使用new/delete申请和释放的的区域被称为自由存储区。因此,自由存储区的实际位置和new/delete申请/释放的位置有关。大部分编译器中new申请空间都是由malloc实现,默认是在堆上实现自由存储。但是用户也可以通过重载
2022-03-03 19:01:20 1648
原创 C++ 栈与堆详谈
栈和堆作为C++内存中的动态数据区,在程序执行过程中被动态的申请与释放,是C++内存管理中非常重要的环节。在程序执行过程中,堆和栈有不同的分工,两者的区别为: 栈 堆 编译器自动申请与释放 用户手动申请与释放 连续存储结构,不会造成内存碎片 链式存储结构,容易造成内存碎片 编辑器自动处理,不会造成内存泄漏 容易造成内存泄漏 由高
2022-03-03 16:09:39 1353
原创 C++ 内存管理:栈、堆、BSS、data、text
C++是一门追求极致性能的语言,合理的内存管理能够缔造出极致性能的代码,否则,不合理的内存管理,会成为日常隐患,产生一系列的BUG。Linux下操作系统程序地址空间的内存管理分布图如下所示:C++程序在执行时,内存区域主要可以分为四个部分:栈、堆、全局区(静态数据区)、代码段。栈区:由编译器自动开辟与释放,存放函数的参数值、局部变量等,栈区是由高地址位向低地址位增长,是一块连续的内存区域,一般最大尺寸为2M。堆区:由程序员使用malloc/free进行申请和释放,堆区是由低地址.
2022-03-03 14:52:08 1434
原创 C++类型转换:static_cast、reinterpreter_cast、dynamic_cast、const_cast
C++支持C语言的强制类型转换,并提供了四种应对各种的强制类型函数,以下对C++的强制类型转换做简单介绍。1.C语言风格强制类型转换TypenameB b;TypenameA a=(TypenameA)b;C语言风格类型强制转换存在较多安全隐患,例如:1)把一个指向 const 对象的指针转换成指向非 const 对象的指针;2)把一个指向基类对象的指针转换成指向一个派生类对象的指针;3)C 风格的转换不容易查找,他由一个括号加上一个标识符组成, 而这样的东西在 c++程序里一大
2022-03-01 16:40:24 254
原创 C++ extern“C“详谈
C++语言在编译的时候为了解决函数的多态问题,建立了与C语言编译器不同的函数名修饰规则,C++语言在编译的时候会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接阶段无法找到对应函数的情况。因此,C函数就需要用extern “C”进行链接指定,通知编译器以下函数或文件中函数是C语言函数,编译时按照C语言编译器的函数名修饰规则,保持函数的名称,不回生成用于链接的中间函数名。C语言编译器的函数名修饰规则对于__stdcall调用约定,编译器和链接...
2022-03-01 11:23:08 147
原创 C++ extern浅析
extern是外部声明关键字,字面意思就是声明某种变量或函数,在外部定义。extern声明变量的两种方法1.在其他文件中直接extern#include<iostream>#include<vector>using namespace std;extern int a ;int main() { cout << a << endl; return 0;}#include<iostream>#include"te
2022-02-28 20:35:29 1078 1
原创 C++ static关键字作用浅析
static作用改变被修饰变量或函数的作用范围与生命周期。全局变量static修饰全局变量时,在同一文件中被修饰的全局变量和普通全局变量的作用范围与生命周期没有区别,但被修饰的全局变量只能在定义的文件中可见,其他文件无法访问该变量。局部变量static修饰函数中的局部变量时,该变量不会因为所在函数执行结束而被释放。普通函数static修饰函数时,表明该函数只能在定义的文件中被调用。类数据成员static修饰类数据成员时,表明对该类所有对象这个数据成员都只有一个实例。即该实
2022-02-28 20:11:04 264
原创 C++ cin输入 不定长输入
C++ 不定长输入,保存进数组,并打印#include<iostream>#include<vector>using namespace std;int main() { vector<int> arr; int i; do { cin >> i; arr.emplace_back(i); } while (cin.get() != '\n'); for (auto it = arr.begin(); it != arr.end
2022-02-28 15:33:45 2011
原创 C++ std 命名空间
std是一个命名空间,C++标准库中的标准函数与标准类都在std中定义,为了防止用户自定义函数或类与标准中命名冲突,使用标准库中需要限定命名空间。标准库调用#include<iostream>命名空间限定using namespace std;//或std::C++非标准库中不存在std类,调用函数时不需要使用std。非标准库调用#include<iostream.h>...
2022-02-28 14:48:04 2121
原创 C++ strcpy函数
函数功能把含有'\0'结束符的字符串复制到另一个地址空间。函数声明:char *strcpy(char* dest, const char *src);把以src为首地址NULL为结束符的数据复制到已dest开始的地址,但是,src与dest空间不能有重叠,且dest必须有足够的空间。C++提供strcpy此类函数,为了对指针操作更加安全,避免内存泄露等异常状态的发生。例如:char *p=new char[10];p="hello";delete p[];//此步释放时将报错❌
2022-02-28 14:04:13 13543 1
原创 C++ 空指针、野指针
空指针一个被赋值为0的指针,它不指向任何的对象或者函数。注意:指向内存编号为0的空间是空指针,当初始化指针变量,如果刚开始不知道指向那 就给他初始化指向0编号,但是空指针指向的内存是不可以访问(0到255之间是系统占用的内存用户不可以访问)。空指针定义int *p=nullptr;//C++int *p=NULL;//C用户对空指针进行操作时会引发异常,因此对指针进行操作时,要对指针进行非空判断if(p==nullptr){ return ;//指针为空时,直接返回,避免程
2022-02-28 11:22:13 642
原创 c++/c 数组与指针区别
数组 指针 保存数据 保存数据地址 直接访问数据 间接访问,首先获得数据的地址,然后从该地址中获得数据 通常数据数据数目固定,且数据元素类型相同 用于动态的数据结构 隐式的分配和删除内存 手动分配和删除内存,关键词:new、delete 自身即为数据名 指向匿名数据或函数 ...
2022-02-28 10:06:06 287
原创 C++ 引用与指针区别
1.引用是一个别名,指针是一个变量;变量中存储的数据是地址。2.对指向地址变量进行操作时,引用不需要解引用;指针需要解引用(加*)。3.引用定义时需要有明确指向,且指向一旦确定就不能改变;指针定义时指向可以为空,且中途指向可以改变。4.++运算意义不一样,引用名++:表示引用变量的值++;指针名++:表示指向地址++。同理,sizeof(引用)返回值是引用变量开辟的大小;sizeof(指针)返回值是指针变量本身的大小,与指针指向变量类型无关。5.引用只有一级;指针有多级。6.引用不能被c
2022-02-27 21:06:53 335
原创 C++ share_ptr 循环引用问题浅析
share_ptr指针涉及到循环引用问题会因为share_ptr指针对应的use_count()无法清0,导致内存泄露,直接上例子:class S_B;class S_A{public: shared_ptr<S_B> m_b;}; class B{public: shared_ptr<S_A> m_a;}; int main(){ while (true) { shared_ptr<S_A> S_a(new S_A)
2022-02-26 19:36:34 5134
原创 C++ 智能指针:unique_ptr、shared_ptr、weak_ptr
在使用基本指针类型时,需要手动释放指针指向的内存,容易造成内存泄漏。而智能指针类型就是将基本指针类型封装成模板类,以便更好地管理内存。智能指针就是一个类,当超出类的作用域时,编译器会自动调用析构函数,自动释放资源,所以智能指针的作用原理就是函数结束时自动释放空间,无需手动释放内存空间。智能指针的初始化&&赋值智能指针拥有explicit构造函数,因此普通指针类型不能隐式转换成智能指针,需要显式调用shared_ptr<int> sp;//定义shared指针int
2022-02-26 19:02:28 282
原创 C++中的NULL、nullptr
关键字NULL在VS2017中的定义为:#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif在VS2017中,C++中的NULL等同于数字0,C中的NULL被定义为空指针。在C++中,由于函数重载原因,仅仅把NULL定义为0,而空指针使用关键字nullptr代替。例:void pfun(int a)
2022-02-25 16:45:43 449
原创 c++11 auto关键字
C++11中 可以利用auto关键字在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,但是不能利用函数的传参以及数组类型变量声明。例·1:利用auto关键字赋值固定类型int val = 1; auto auto_val = val; //自动类型推断,auto_val为int类型 cout << typeid(auto_val).name() <<" auto_val ="<< auto_val << en...
2022-02-25 15:50:42 336
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人