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

两万字总结《C++ Primer》要点

若c为空,函数行为未定义 c.front() 返回c首元素引用。若c为空,哈数行为未定义 c[n] 返回c中下标为n元素引用,n是一个无符号整数。...如果把一个函数声明成虚函数,则该函数派生隐式也是虚函数。 (2)定义派生 派生必须通过派生列表明确指出它是从哪个继承而来。...P543 公有、私有和受保护继承: 派生访问说明符对于派生成员(及友元)能否访问其直接成员无影响; 成员访问权限只与访问说明符有关。...名字冲突与继承: 派生成员将隐藏同名成员。 ::: tip 出了覆盖继承而来函数外,派生最好不雅重用其他定义名字。...术语 覆盖:override,派生定义函数如果与定义同名虚函数与相同形参列表,则派生版本将覆盖版本。 多态:程序能够通引用或指针动态类型获取类型特定行为能力。

1.5K30

两万字总结《C++ Primer》要点

若c为空,函数行为未定义 c.front() 返回c首元素引用。若c为空,哈数行为未定义 c[n] 返回c中下标为n元素引用,n是一个无符号整数。...如果把一个函数声明成虚函数,则该函数派生隐式也是虚函数。 (2)定义派生 派生必须通过派生列表明确指出它是从哪个继承而来。...P543 公有、私有和受保护继承: 派生访问说明符对于派生成员(及友元)能否访问其直接成员无影响; 成员访问权限只与访问说明符有关。...名字冲突与继承: 派生成员将隐藏同名成员。 ::: tip 出了覆盖继承而来函数外,派生最好不雅重用其他定义名字。...术语 覆盖:override,派生定义函数如果与定义同名虚函数与相同形参列表,则派生版本将覆盖版本。 多态:程序能够通引用或指针动态类型获取类型特定行为能力。

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

读完某C++神作,我只记下了100句话

c[n]和c.at(n)只适用于vector deque,n=c.size()操作未定义【c.at(n)会抛out_of_range】。...makepair函数可以创建pair对象。vector >如果需要多个pair可以放在一个vector。 set中元素不重复,相当于只有键没有值。...用做必须是已定义。 存在虚函数+指针或引用==产生多态。非虚函数编译时就按指针或引用或对象类型确定。可以使用域操作符强制调用函数【虚调虚】。函数和派生默认实参要一致。...派生继承访问控制标号【何种方式继承】无论是什么,不影响派生使用成员,但影响使用派生用户访问成员。使用接口继承还是实现继承派生用户具有重要含义。 友元关系不继承。...纯虚函数==抽象==无法创建对象 派生对象复制到时派生对象将被切掉【而指针和引用不会】。

1.4K20

C++关键知识点梳理

基本类型基本类型大小随编译器决定,下面以32位为例类型大小 (字节)bool未定义char1short2int4long4long long8float4double8变量变量初始化,C++,使用未初始化变量是一种错误编程行为...,未初始化变量含有一个不确定值,所以定义变量时最好初始化,成员使用初始化列表构造函数初始化均是良好编程习惯;变量定义和声明:变量可以多个文件声明(external int i),但是只能在一个文件中被定义...但是针对某些情况,例如两个互相依赖或者成员包含本身,这就需要使用指针或引用,对于未定义只声明使用前需要向程序引入前向声明。...protected继承方式所有 public 成员派生为 protected 属性;所有 protected 成员派生为 protected 属性;所有 private...private继承方式所有 public 成员派生均为 private 属性;所有 protected 成员派生均为 private 属性;所有 private 成员派生不能使用

91830

C++ 万字长文第一篇---拿下字节面试

那么可以让定义一个函数,并不给出具体操作内容,让派生继承时候在给出具体操作,这样函数被称为纯虚函数。含有纯虚函数成为抽象,抽象不能声明对象,只能用于其他继承。...析构函数每次删除对象时候调用,函数名称和名相同,但在前面加了一个 符号,同样无返回类型。若对象调用过程中用 动态分配了内存,可以析构函数写 语句统一释放内存。...假设存在继承:孙继承父,父继承爷构造过程:爷 -> 父 -> 孙析构过程:孙 -> 父 -> 爷 析构函数和虚函数 可能作为继承父析构函数需要设置成虚函数,这样可以保证当一个指针指向其子类对象并释放指针时候...main() { cout << __FUNCTION__ << endl; return 0; } 虚函数表 在有虚函数,存在一个虚函数指针,该指针指向一张虚函数表,当子类继承时候...当子类重写函数时,会将虚函数地址替换成重写函数地址。 ?

1.5K20

Effective Modern C++翻译(7)-条款6:当auto推导出意外类型时,使用显式类型初始化语义

就像注释指出那样,processWidget调用行为现在是未定义了,但是为什么呢,答案可能会十分令人惊讶,使用auto代码,highPriority类型不再是bool,尽管std::vector...highPriority值取决于std::vector::reference是如何实现,一种实现方式是std::vector::reference包含一个指针指向机器字,加上引用偏移...features调用返回了一个临时std::vector对象,这个对象没有名字,但是为了方便讨论,我这里叫它temp,[]运算符temp上调用,返回std::vector<bool...所以highPriority也包含一个指向temp机器字指针,加上相应偏移量5,语句最后,temp被销毁了,因为这是一个临时对象,因此highPriority包含了一个悬垂指针,导致processWidget...暗示了容器中间),最终目的是计算获得这个元素下标,如果你确定最终结果不会超过int范围,如果容器是c,double是d,你可以这样计算下标: int index = d * c.size()

1.1K100

C++ 学习笔记

模板特化同时需要特化所有的成员函数,非特化函数特化后模板属于未定义函数,无法使用。...2.模板定义对象时,为了避免产生未定义行为,可以进行零初始化。...template void foo() {     T x = T(); // x提供默认值 } 5.3 使用 this -> 1.若模板也是模板,这时模板不能直接通过名称调用从继承成员...2.非依赖型:无需知道模板名称就可以完全确定类型。 3.非依赖型派生查找一个非受限名称时,会先从非依赖型查找,然后才是模板参数列表。...空优化:作为时,如果为它不分配内存不会导致它存储到其他同类型对象或者子类型对象相同地址上,则可以不分配。

6.5K63

Chapter 2: auto

声明并初始化 模板函数可以使用auto来完成变量自动类型推导 例如: template void dwim(It b, It e) { for(; b!...>,编译器需要从m每个对象进行一次拷贝,创建一系列临时变量,然后再将这些临时变量依次绑定到引用p,循环结束时,这些临时变量再被编译器进行销毁。...所以,(1),隐式自动转换是成功,而在(2),auto自动接收了std::vector::reference对象类型,没有发生转换,而该对象实际指向是一个临时std::vector...(4)中就会出发未定义行为。 代理介绍 std::vector::reference是代理一个例子,它们存在目的是模拟和增强其他类型行为。...例如标准库智能指针类型也是代理例子,它们负责原始指针指向资源管理。 有一些代理用户可见,比如std::shared_ptr,std::unique_ptr。

1.1K70

STL之容器适配器(stack,queue和priority_queue)

priority_queue:是一个封装了 vector 容器适配器模板,默认实现是一个元素排序,保证最大元素总在队列最前面的队列。...size():返回栈中元素个数。 empty():没有元素情况下返回 true。 emplace():用传入参数调用构造函数栈顶生成对象。...如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义。 back():返回 queue 中最后一个元素引用。...如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义。 push(const T& obj): queue 尾部添加一个元素副本。...:通过调用传入参数构造函数序列适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。 top():返回优先级队列第一个元素引用。 pop():移除第一个元素。

37330

C++教程(凯格尔训练法教程)

(234,"yar");//堆上创建对象 注:不可以定义同时其数据成员进行初始化,因为不是一个实体,不合法但是能编译运行 对象成员引用:对象名.数据成员名 或者 对象名.成员函数名(参数列表...派生对象赋值给对象、将派生指针赋值给指针、将派生引用赋值给引用 派生对象赋值给对象,舍弃派生新增成员;派生指针赋值给指针,没有拷贝对象成员,也没有修改对象本身数据,...仅仅是改变了指针指向;派生引用赋值给引用,和指针一样。...、 上转型后通过对象、指针、引用只能访问从继承过去成员(包括成员变量和成员函数),不能访问派生新增成员 15.2 多态 不同对象可以使用同一个函数名调用不同内容函数。...15.3 虚函数 实现程序多态性一个重要手段,使用对象指针访问派生对象同名函数。 将函数声明为虚函数,派生同名函数自动为虚函数

2.8K20

第 9 章 顺序容器

当不确定使用那种容器时,可以程序只是用 vector和 list公共操作:使用迭代器,不使用下标操作,避免随机访问。这样,必要时更换成 vector或 list都很方便。...比如, // 假定 noDefault是一个没有默认构造函数类型 // init是一个 noDefault对象,下面语句执行是 noDefault拷贝构造函数 vector<noDefault...一个容器元素进行访问前,要先检查容器是否为空。对空容器进行访问元素操作,就像使用一个越界下标一样,是一种很严重程序设计错误。 c[n],返回元素引用,但不进行范围检查。...如果下标越界,函数行为未定义! c.at(n),返回元素引用,编译器进行安全检查,如果越界,抛出 out_of_range异常。 容器访问元素成员函数返回都是引用。...**遍历操作forward_\list进行删除或添加元素操作,需要使用到两个迭代器————一个指向我们要处理元素,另一个指向其前驱。

83550

C++教程(最全)「建议收藏」

(234,"yar");//堆上创建对象 注:不可以定义同时其数据成员进行初始化,因为不是一个实体,不合法但是能编译运行 对象成员引用:对象名.数据成员名 或者 对象名.成员函数名(参数列表...派生对象赋值给对象、将派生指针赋值给指针、将派生引用赋值给引用 派生对象赋值给对象,舍弃派生新增成员;派生指针赋值给指针,没有拷贝对象成员,也没有修改对象本身数据,...仅仅是改变了指针指向;派生引用赋值给引用,和指针一样。...、 上转型后通过对象、指针、引用只能访问从继承过去成员(包括成员变量和成员函数),不能访问派生新增成员 15.2 多态 不同对象可以使用同一个函数名调用不同内容函数。...15.3 虚函数 实现程序多态性一个重要手段,使用对象指针访问派生对象同名函数。 将函数声明为虚函数,派生同名函数自动为虚函数

2.4K30

字节一面,轻松通过!

每个元素在内存中都保留了前一个和后一个元素引用,因此添加或删除元素时,不需要像ArrayList那样移动元素,只需改变引用即可。...虚函数和多态性 虚函数声明函数可以被子类重写(覆盖)并在运行时动态绑定到相应函数。使用 virtual 关键字声明函数为虚函数。...,通过函数进行调用时,会根据实际对象类型调用对应函数,这种行为称为多态性。...每个包含虚函数都有一个对应函数表,表存储了虚函数地址。在运行时,编译器根据对象实际类型查找虚函数表,并调用相应函数。...纯虚函数和抽象 纯虚函数: 一个可以包含纯虚函数,通过函数声明末尾添加 = 0 来声明纯虚函数。含有纯虚函数是抽象,无法实例化,只能用作

14710

标准库容器

* assign允许我们从不同但相容类型赋值,或者从一个容器子序列赋值 * 除了string外,指向容器迭代器、引用和指针swap操作后都不会失效 */ vector...返回新添加第一个元素迭代器,若列表为空,则返回p_iterator 向一个vector、string或deque插入元素会使所有指向容器迭代器、引用和指针失效 记住,insert函数将元素插入到迭代器所指定位置之前...若c为空,函数行为未定义 c.front() 返回c首元素引用。若c为空,函数行为未定义 c[n] 返回c中下标为n元素引用,n是一个无符号整数。...若n>=c.size(),则函数行为未定义 c.at(n) 返回下标为n元素引用。...函数返回void c.pop_front() 删除c首元素,如果c是空,则函数行为未定义

66230

第4章 表达式

因此,作用于解引用指针时,即使该指针是一个未初始化指针也不会有影响,它返回是所值类型空间大小。    char或者类型为 char表达式执行 sizeof运算,结果得 1。   ... string或 vector对象执行 sizeof运算,只返回该类型固定部分大小,和里面存放了多少数据无关。...指向任意非常量指针能转换成 void*。     3. 指向任意对象指针能转换成 const void*。     4. 派生指针或引用能转换成指针或引用。 5....对于未使用 explicit修饰构造函数或重载了类型转换运算符类型,编译器可以自动执行一次类型转换。 显式类型转换 static_cast。...运行时类型识别,用于将指针或引用安全地转换为派生指针或引用。 14.旧式类型转换从表现形式上不如强制转换那么明显,一旦出现问题,追踪起来并不容易。

57440

智能指针面试得重要地位!

必须具备一个虚析构函数 }; //改进返回值型别 template<typename......引用计数是与资源关联值 //用来记录跟踪指涉到该资源 std:shared_ptr数量,其构造函数会使计数递增,析构函数使计数递减,如果std::shared_ptr //实施一次递减后引用计数变成了零...,也包含一个指涉到该资源引用计数裸指针 2,引用计数内存必须动态分配 3,引用计数递增和递减必须使原子操作,因为不同线程可能存在并发读写器,一个线程析构,一个复制,原子操作比非原子操作慢...第1 部分,是声明 个指针型别的数据成员,指涉到 个非完整型别, 第2 部分,是动态分配和回收持有从前原始那些数据成员对象,而分配和回收代码则放在实现文件。...惯用法通过降低客户和实现者之间依赖性,减少了构建遍数 // • 对于采用 std: :unique_ptr 来实现 plmpl 指针,须在头文件声明 // 特种成员函数,但在实现文件实现它们

99220

4.2 C++ Boost 内存池管理库

pool_allocator模板容器内特殊成员进行初始化。...通过使用shared_ptr引用计数技术,可以动态地改变派生具体实现,而不会影响到接口实现。其仅对外部暴漏最小细节,内部类实现用一个shared_ptr来保存指针。...如下案例我们定义了shared_vector,当MyShared内容发生变化时,由于ptr指向了MyShared,则ptr值也会随着MyShared内容变化而变化。...它是一个轻量级智能指针,相比于标准库shared_ptr,intrusive_ptr可以方便地自定义数据结构中使用,因为它不需要在自定义类型维护额外引用计数器。...该指针采用了惯用法,即将引用计数器作为自定义类型一部分存储实例。因此,使用intrusive_ptr时,需要为自定义类型提供一个内部引用计数器实现。

26820

4.2 C++ Boost 内存池管理库

,我们使用时只需要包含头文件pool_alloc.hpp,当包含此头文件后读者可使用pool_allocator模板容器内特殊成员进行初始化。...通过使用shared_ptr引用计数技术,可以动态地改变派生具体实现,而不会影响到接口实现。其仅对外部暴漏最小细节,内部类实现用一个shared_ptr来保存指针。...++,shared_ptr还可以与工厂模式(Factory Design Pattern)结合使用,工厂模式是一种创建型设计模式,该模式包装了new操作符使用,使对象创建工作集中工厂或工厂函数上...如下案例我们定义了shared_vector,当MyShared内容发生变化时,由于ptr指向了MyShared,则ptr值也会随着MyShared内容变化而变化。...它是一个轻量级智能指针,相比于标准库shared_ptr,intrusive_ptr可以方便地自定义数据结构中使用,因为它不需要在自定义类型维护额外引用计数器。

53840

常见c和cpp面试题目汇总(一)

关键字可有可无 override,派生覆盖函数,实现接口重用;特征:不同范围(和派生)、函数名字相同、参数相同、必须有virtual关键字(必须是虚函数) overwrite,派生屏蔽了其同名函数...十、STLvector实现,是怎么扩容vector使用注意点及其原因,频繁vector调用push_back()性能影响和原因。...如果析构函数不被声明成虚函数,则编译器实施静态绑定,删除指向派生指针时,只会调用析构函数而不调用派生析构函数,这样就会造成派生对象析构不完全。...),其操作数相对是安全 2)dynamic_cast:运行时检查 用于集成体系中进行安全向下转换downcast,即指针/引用->派生指针/引用 dynamic_cast是4个转换唯一...函数一旦结束,形参生命也宣告终结,做出修改一样没任何变量产生影响。 用引用作为返回值最大好处就是在内存不产生被返回值副本。 但是有以下限制: 1)不能返回局部变量引用

1.2K31
领券