首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

实际运用代码过程中,可能存在局部变量之间命名冲突/库与局部变量命名之间相互冲突情况,因而我们可以局部域全局域之外设置一个区域:命名空间域。...程序在编译时优先顺序:局部域->全局域->展开命名空间域 三.函数重载 【函数重载】 是函数一种特殊情况,C++允许同一作用域中声名几个功能类似的同名函数显著特征:这些同名函数形参列表...3.内联函数声明和定义必须要放在一起原因 编译器一旦把某个函数作为内联函数处理,就会在其调用位置展开,即该函数没有地址,源文件编译后不会形成符号表,没有链接冲突。...关键字 说明: 函数可访问类私有和保护成员,但不是类成员函数 函数不能用const修饰 函数可以类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数...需要自己写情况: 有动态申请资源时,需要自己写析构函数释放空间。(防止内存泄漏) 不需要自己写情况没有动态申请资源时,不需要自己写,系统会自动回收空间

15610

C++为什么有参数依赖查找(ADL)?

查找时,还存在一些特殊规则,以下仅举两例:比如在查找域运算符::左边名字时,会忽略函数、变量、枚举等,只有类型名称会被查找类内部声明函数,其名称查找规则与成员函数相同。...类外部定义函数,其查找规则与命名空间函数相同。限定名称查找限定名称查找用于处理作用域解析操作符::右侧出现名称。...查找合并:将普通未限定查找找到声明集合与ADL找到声明集合合并,并应用特殊规则,例如,通过ADL可见关联类中函数函数模板,即使它们普通查找中不可见。...为什么与 yyy.h 一起编译时候,没有include情况下也会失败呢?...避免命名冲突:ADL通过参数类型命名空间中查找函数,减少了全局命名空间污染,有助于避免命名冲突

8410
您找到你想要的搜索结果了吗?
是的
没有找到

【C++】类和对象核心总结

namespace域: 命名空间域,这个域里面可以由程序猿来放一些可能与库中函数或关键字起冲突东东,和类一样,我们也可以选择性放开命名空间功能对外开放,通过利用三种使用命名空间方式。...有了上面知识讲解,就好解决这个问题了,由于内联函数不建立栈帧,在编译阶段就被展开在相应位置了,所以二进制指令里面就没有建立函数栈帧指令,自然就没有形参概念,所以这种情况,this指针根本不存在...这种情况下继续依靠编译器默认生成析构显然无法满足资源清理工作,这时候就需要我们手动去将申请空间还给操作系统。...2.将全局重载写成函数,下面会讲到函数。 4.2 流插入(>)运算符重载 a....函数可访问类私有和保护成员,但不是类成员函数 函数不能用const修饰 函数可以类定义任何地方声明,不受类访问限定符限制 一个函数可以是多个类函数 2.所有成员函数都可以是另一个类函数

71430

内联和嵌套命名空间

代码中会定义很多类名、函数名、模板名,甚至一些全局变量,如果不对这些名称加以规范,很容易造成名字冲突,因为默认情况下这些名字都是全局名字,这种情况也称之为命名空间污染。...为了避免这个问题,C++标准引入了命名空间概念,将不同模块名字限定在各自模块命名空间中,命名空间名字作用域只命名空间内有效,尽可能地避免名字冲突。...foo函数,前面需要加上Lib_V1前缀,而访问Lib_V2命名空间foo函数则不需要。...当遗憾是,C++17中没有解决嵌套命名空间中定义内联命名空间,也就是说在上面的嵌套命名空间中没法加入inline关键字,使得子命名空间成为内联,直到C++20标准中完善了这个功能。...因此C++20中,我们可以通过以下方式来定义命名空间:namespace A::B::inline C { void foo() {}}// 它等同于如下定义:namespace A::B {

12420

【Example】C++ 虚基类与虚继承 (菱形继承问题)

当一个类继承了两个来自同父类子类后,会产生命名空间冲突及资源冗余。...因此,可以看出,实际上 Blu 类当中存在两个 Gem 成员变量,分别来自 Byte 和 Expert,使用 this 指针进行调用,会发生命名空间冲突错误,同时造成了资源重复浪费。...这时,Base 便成了 Byte 和 Expert 虚基类,达成了虚继承方式,Base 类最终 Blu 类中只存在一个,所以不存在命名空间冲突及资源浪费。...同时,虚继承机制当中,虚基类是由最终派生类进行初始化,本身达成了一种 “间接继承” 关系。 也就意味着最终派生类构造函数初始化中,要在初始化表中调用虚基类构造函数进行初始化。...、外部都可以访问 protected 保护成员: 基类、派生类、可以访问 private 私有成员 :基类、可以访问 继承方式 基类 public 成员 基类 protected 成员 基类 private

92130

函数 之前我们Time类示例中,我们重载乘法运算符参数和其他参数不一样,因为有两种不同类型,即Time和double类型,限制了调用方式,我们成员函数调用过程是b..opertaor*...解决办法是,让他不由对象调用,而由非成员函数调用,但是非成员函数无法访问类对象内数据。怎么办。。。...,即函数 创建函数 创建函数第一步将原型放在类声明中,并且声明前加上friend friend Time operator*(double,const Time&T); 首先他是一个非成员函数...T*n; } 这样该函数没有访问到数据,但是可以用我们之前成员函数进行计算,我们这里替换了一下参数顺序,也有和函数一样作用(最好是 可以成为类接口一部分) 重载<<运算符 方式1:...比如在只声明B是A情况下,B可以访问A私有成员,但是A却不可以访问B私有成员,即A不是B。 (3)关系不能传递:如果B是A,C是B,则不能说明C是A

13810

8.3 C++ 定义并使用类

,而析构函数则执行了两次,第一次释放后,第二次释放内存则出现冲突情况....system("pause"); return 0;}接着看下面的深拷贝代码,我们通过自己开辟堆空间,然后自己拷贝构造函数中拷贝数据,防止冲突,同样代码经过简单修改,就可以避免拷贝是数据释放冲突问题...: 如下定义空指针,并尝试使用空指针访问类,那么如果类中没有判断空指针语句,则程序会崩溃....per2.showInfo(); system("pause"); return 0;}函数定义: 将全局函数定义为函数,让外部函数,可以访问特定类内部私有数据....#include #include using namespace std;class Student{ // 定义函数 --> 让goodGay 可以访问我私有属性

20620

闭关多日,整理一份C++中那些重要又容易忽视细节

注意:假设名空间和声明区域定义了相同名称,试图使用声明将名空间名称导入该声明区域,则两个名称会发生冲突,从而出错。...没用过,下次可以试试自己写一个名空间,如果是没有名字空间,那么只能在包含那个名空间文件里面使用该名空间内部内容,类似于,静态变量、函数集合。...它是定义类外普通函数,它不属于任何类,但需要在类定义中加以声明,声明时只需名称前加上关键字friend,其格式如下: friend 类型 函数名(形式参数); 函数声明可以放在类私有部分...,也可以放在公有部分,它们是没有区别的,都说明是该类一个函数。...另外,应该看到某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序运行效率。 为了解决上述问题,提出一种使用友方案。

58210

进化史

其次,如果引入两个库,它们都包含相同函数名称,则会出现错误,因为它们共用同一个命名空间,链接器会在主表查询,当发现两个定义不同同名函数,必然会报错。...现在我们似乎已经很好解决了命名空间这个问题,事实上,C++使用多个命名空间,这也是其具备很好扩展性基础,想必大家对与std::不会感到陌生,这是标准C++库命名空间不同命名空间使用相同标识是不会发生冲突...需要注意一点是,不要在头文件中放使用指令,using namespace XXX,这样会破坏对指定命名空间保护,因为头文件引用通常在文件最开始处,这样整个文件中使用指令都会有效,这就意味着命名空间保护使用该头文件任何文件中消失...有时还有这样需求,想要其它不属于当前结构一个成员函数访问当前结构中数据,那该怎么办呢?这时候需要用到“概念。...什么是“”呢,就是使用friend标志来声明一个外部函数,以告知编译器“这是我这个类朋友,他可以访问我所有成员权限。”,这样这个便能访问其所有的成员和成员函数

79850

C++初阶 入门

使用命名空间目的是对标识符名称进行本地化,以避免命名冲突或名字污染,namespace关键字出现就是针对这种问题。...我们命名与前人在头文件中写函数名字出现了冲突。...别慌,首先呢这一大串是对应函数地址,而之所以是对应函数地址是因为,我们创建命名空间就像是自己家外建立了一块围墙 有人想进来找东西,那肯定得要有钥匙,而没钥匙自然只能去墙外面找。...而编译器墙外找到了一个叫rand函数,自然就把它用起来了。 那么我们要怎么才能进入到对应命名空间中取出对应变量呢?...那么这个时候我们要回避命名冲突问题,我们就可以使用嵌套命名空间方式,是的,你没有听错,命名空间是可以嵌套

8410

C++基础知识精髓

内联函数:在编译阶段函数代码替换函数名,调用运行时候就没有函数压栈和出栈操作,提高运行效率,是空间换时间。... 类具备封装和信息隐藏特性。只有类成员函数才能访问类私有成员,程序中其他函数无法访问私有成员。...另外,应该看到某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序运行效率。 为了解决上述问题,提出一种使用友方案。...2.只能出现在类定义内部,声明可以类中任何地方,一般放在类定义开始或结尾。 3.可以是普通非成员函数,或前面定义其他类成员函数,或整个类。...4.类必须将重载函数集中每一个希望设为函数都声明为。 5.关系不能继承,基类对派生类成员没有特殊访问权限。如果基类被授予关系,则只有基类具有特殊访问权限。

2K50

C++:类与对象(3)

一、深入解析构造函数 如上图,在一般情况下,我们认为A类中_a1和_a2只不过是声明,并没有空间,而真正空间开辟是【定义】时候,也就是我们根据这个类实例化出整个对象时候。...老铁们可能会想到用在全局设置一个count变量,然后每个类构造函数里++一次 这是因为count和std命名空间count冲突了,因此有两个方法: 1、认怂,给count换个名字 2、对std部分展开...但是会增加耦合度,破坏了封装,所以 不宜多用。 分为:函数类 3.1 函数 之前博主类与对象(2)日期类实现中用到过一次。...但是类外定义的话没办法直接用类里面的私有成员,如果强行变成公有就破坏了封装性,所以这里会用到知识,函数可以直接访问类私有成员,它是定义类外部普通函数,不属于任何类,但需要在类内部声明...,但不是类成员函数 2、函数不能用const修饰(没有this指针) 3、函数可以类定义任何地方声明,不受类访问限定符限制 4、一个函数可以是多个类函数 5、函数调用与普通函数调用原理相同

9310

C++中你不知道namespace和using用法

namespace 本质是作用域,可以更好控制标识符作用域 命名空间 就可以存放 变量 函数 类 结构体 ... 2 命令空间使用 1)命令空间定义 必须定义全局范围 2)命名空间下可以存放..., namespace newname = oldname;新名字与旧名字有同等效益 namespace NewA = A; 6)命名空间可以没有名字 ,没有名字相当于给命名空间所有成员加上了static...相当于只能被当前文件调用,属于内部链接属性 namespace { int a = 10; void func() { cout << "hello namespace" << endl; } } 7)命名空间函数可以先声明...; } void test03() { A::foo(222); } 总代码 #include using namespace std; // 命令空间定义 必须定义全局范围...// 命名空间下可以存放 变量 函数 结构体 类 // 命名空间可以重名 重名命名空间相当于合并操作 // 命名空间可以嵌套命令空间 namespace A { int a = 1; void

44630

C++基础知识复习

---- namespace_命名空间 C++避免名字冲突——使用命名空间。 例如: 不同命名空间同一个变量,所对应内容不同。...---- 全局函数函数 一个类成员函数作为另外一个类函数 ---- C++开发中,能不用全局函数就不用全局函数。 尽可能用类概念来做。...---- 类、函数,使用friend关键字进行声明即可,与访问权限无关。...一般情况下,双目运算符,使用友函数更直观。 例如: 100 + person 只能通过来实现。 person + 100函数和成员函数都可以实现。...注意: C++规定运算符重载操作对象至少有一个不是标准类型,而是用户自定义类型。 特殊情况: (1)= () [] -> 不能重载为类函数

53710

【C++初阶】C++入门

19、friend 。使其不受访问权限控制限制。例如,1个类中,私有变量外部是不能直接访问。...可是假如另外1个类或函数要访问本类1个私有变量时,可以把这个函数或类声明为本类函数类。这样他们就可以直接访问本类私有变量。...public为公有的,访问不受限制;protected为保护,只能在本类和中访问;private为私有的,只能在本类、派生类和中访问。...具有静态生存期变量,只函数第一次调用时进行初始化,没有显示初始化情况下,系统把他们初始化微0. 28、sizeof 返回类型名或表达式具有的类型对应大小。...调用该函数时,如果没有指定实参则采用该默认值,否则使用指定实参。

1.2K30

第 18 章 用于大型程序工具

构造函数进入其函数体之前会首先执行初始值列表。因为初始值列表抛出异常时,构造函数体内 try块还未生效,所以构造函数体内 catch语句无法处理构造函数初始值列表抛出异常。...一个另外未声明类或函数如果第一次出现在声明中,则我们认为它是最近外层命名空间成员。这条规则与实参相关查找规则结合在一起,将产生意想不到效果。...因为 f接受一个类类型实参,而且 f C所属命名空间进行了隐式声明,所以 f能被找到。相反,因为 f2没有形参,所以它无法被找到。...namespace A { class C { // 两个声明之外没有其他声明 // 这些函数隐式地成为命名空间 A成员...}; } int main () { A::C cobj; f(cobj); // 正确: 通过 A::C中声明找到 A::f f2();

98050

第 18 章 用于大型程序工具

构造函数进入其函数体之前会首先执行初始值列表。因为初始值列表抛出异常时,构造函数体内 try块还未生效,所以构造函数体内 catch语句无法处理构造函数初始值列表抛出异常。...一个另外未声明类或函数如果第一次出现在声明中,则我们认为它是最近外层命名空间成员。这条规则与实参相关查找规则结合在一起,将产生意想不到效果。...因为 f接受一个类类型实参,而且 f C所属命名空间进行了隐式声明,所以 f能被找到。相反,因为 f2没有形参,所以它无法被找到。...namespace A { class C { // 两个声明之外没有其他声明 // 这些函数隐式地成为命名空间 A成员...}; } int main () { A::C cobj; f(cobj); // 正确: 通过 A::C中声明找到 A::f f2();

90020

C++雾中风景1:类与面向对象

C++之中,类函数是定义类外部,但它有权访问类所有私有(private)成员和保护(protected)成员。尽管函数原型有定义中出现过,但是函数并不是成员函数。...接下来我们来分析一下函数特点。 1、为什么要引入函数实现类之间数据共享时,减少系统开销,提高效率。具体来说:为了使其他类成员函数直接访问该类私有变量。...2)两个类要共享数据时候 3、方式缺点: 1)函数破环了封装机制,除非不得已情况下才使用友函数。 2.关系与面向对象: 接下来我们聊聊怎么从面向对象角度去理解关系。...看起来并不会破坏上文提到面向对象逻辑了,但是涉及到继承又存在一些不大不小坑,我们一起来捋一捋: 关系不能继承。基类对派生类成员没有特殊访问权限。...在这里做一个简单小结:关系类之中没有继承性,只能依赖基类关系。

75830

C ++ 中不容忽视 25 个 API 错误设计!

如果不将API功能限制命名空间中,则可能导致与该系统中使用其他API发生名称冲突。...误#2:在你公共API头全局范围中包含“using namespace” 为什么这是一个错误? 这将导致被引用命名空间所有符号全局命名空间中变得可见,并首先抵消掉使用命名空间好处。...另外: 头文件使用者不可能撤消命名空间包含,因此他们被迫使用决策来使用你命名空间,这是不可取。 它极大地增加了命名空间首先要解决冲突可能性。 当引入新版本库时,程序工作版本可能无法编译。...如果新版本引入名称与应用程序正在从另一个库使用名称冲突,则会发生这种情况。...: enum class NetworkState { Batching, Sending, Waiting }; // enum class 错误#13:使用友C ++中,关系是你类授予另一个类或函数完全访问权限一种方式

1.5K20

C++基础(五).多态

virtual区别:重写基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有 隐藏和重写,重载区别 与重载范围不同:隐藏函数和被隐藏函数不同类中 参数区别...另外,应该看到某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程式运行效率 为了解决上述问题,提出一种使用友方案。...是一种定义类外部普通函数,但他需要在类体内进行说明,为了和该类成员函数加以区别,在说明时前面加以关键字friend。不是成员函数,但是他能够访问类中私有成员。...作用在于提高程式运行效率,但是,他破坏了类封装性和隐藏性,使得非成员函数能够访问类私有成员 能够是个函数,该函数被称为函数也能够是个类,该类被称为函数 函数特点是能够访问类中私有成员非成员函数...std命名空间 class Clock //定义一个时钟类 { public: friend Clock operator ++ (Clock &c); //使用友函数方式对前置++运算符进行重载

64720
领券