
C++ Primer
月雲之霄
这个作者很懒,什么都没留下…
展开
-
C++ Primer
C++ Primer目录索引虚函数表剖析(一) 虚函数表剖析(二) static关键字用法 volatile、const的用法原创 2019-08-16 12:33:09 · 406 阅读 · 0 评论 -
C++基础:各种输入方法总结
输入原理简述:程序的输入都建有一个缓冲区,即输入缓冲区。每次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。#include <iostream>using namespace std;i...原创 2019-09-10 11:50:38 · 387 阅读 · 0 评论 -
C++ 内存管理
1. C++内存管理 C/C++程序内存的分配 C/C++编译的程序占用的内存分区栈区(stack):由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。 堆区(heap):由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局/静态存储区 :全局变量和局部静态变量...原创 2019-07-22 15:46:35 · 144 阅读 · 0 评论 -
【对象程序设计面向】虚继承
BC虚继承A,Dpublic继承BC,有A*a=newD,a->fun(),fun是虚函数,并且BC都重写了,怎么保证a调用的是B重写的虚函数。#include <iostream>using namespace std;class A{public: virtual void fun() { cout << "A::fu...原创 2019-08-03 16:42:46 · 2062 阅读 · 1 评论 -
【C++ Primer | 15】虚函数表剖析(一)
一、虚函数1. 概念多态指当不同的对象收到相同的消息时,产生不同的动作编译时多态(静态绑定),函数重载,运算符重载,模板。 运行时多态(动态绑定),虚函数机制。为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。C++多态实现的原理:当类中声明虚函数时,编译器会在类中生成一个虚函数表...原创 2019-03-29 14:19:53 · 1207 阅读 · 0 评论 -
static、const用法
一、static用法C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量:在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下://Example 1...原创 2019-07-20 22:01:47 · 210 阅读 · 0 评论 -
【C++ Primer | 15】dynamic_cast
#include <iostream>using namespace std;class A {public: virtual void display() { cout << "A::display()" << endl; }};class B : public A {public: void display() { cout...转载 2019-07-24 00:08:08 · 181 阅读 · 0 评论 -
【C++基础】常见面试问题(二)
1. 指针和引用的区别指针保存的是所指对象的地址,引用是所指对象的别名,指针需要通过解引用间接访问,而引用是直接访问 指针可以改变地址,从而改变所指的对象,而引用必须从一而终; 引用在定义的时候必须初始化,而指针则不需要; 指针可以为空,引用不能为空 可以有const指针,没有const引用2. 头文件中的 ifndef/define/endif 是干什么用的? 该用法和...原创 2019-07-22 16:38:37 · 144 阅读 · 0 评论 -
static关键字用法
static修饰局部变量静态局部变量存储在全局静态区 生存期为整个程序生命周期,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。 静态局部变量若在声明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。static修饰全局变量非静态全局变量的作用域是整个源程序,也即在各个源文件中都是有效的...原创 2019-07-22 17:04:37 · 156 阅读 · 0 评论 -
volatile、const的用法
1. volatile访问寄存器要比访问内存要块,因此CPU会优先访问该数据在寄存器中的存储结果,但是内存中的数据可能已经发生了改变,而寄存器中还保留着原来的结果。为了避免这种情况的发生将该变量声明为volatile,告诉CPU每次都从内存去读取数据。 防止编译器对变量的优化 一个参数可以即是const又是volatile的吗? 答案:可以2. const一、const作...原创 2019-07-22 17:23:02 · 1522 阅读 · 0 评论 -
function
类成员函数#include <iostream>#include <functional>using namespace std;class Computer {public: static int Add(int i, int j) { return i + j; } template<class T> static ...原创 2019-08-05 09:28:31 · 147 阅读 · 0 评论 -
c++如何防止一个类被其他类继承?
如何在防止一个类被其他的类继承呢?如果是仅仅为了达到这个目的可以直接把这个类的构造函数设置成私有的,这样就杜绝了其他类的继承。也相当于毁掉了这个类(无法再创造出自己的对象)。那么怎么样既要保证这个类的完整性,又防止其他类的继承呢?这就要借助友元来实现,因为友元是不可以被继承的。如果一个类的构造函数要借助它的友元类,那么继承了这个类的类就无法构造自己的对象。从而杜绝了被继承#inc...原创 2019-08-14 14:40:41 · 721 阅读 · 0 评论 -
【C++ Priemr | 15】派生类向基类转换的可访问性
1. 只有当D公有继承B时,用户代码才能使用派生类向基类的转换;如果D私有继承B的方式是受保护的或者私有的,则用户代码不能使用该转换。class A {};class B : public A {}void function(const A&) {}int main(){ B b; function(b); // 这时就可以使用function(b),会默...原创 2019-06-02 18:29:10 · 280 阅读 · 0 评论 -
C++中构造函数和析构函数可以抛出异常吗?
不建议在构造函数中抛出异常。当构造函数中抛出异常时,析构函数将不会被执行,需要手动释放内存。 析构函数不应该抛出异常。当析构函数中有一些可能发生的异常时,这时候要把可能发生的异常完全封装在析构函数内部,决不能让它抛出到函数之外。测试代码:#include <iostream>using namespace std;class A {public: A(...原创 2019-08-14 17:37:18 · 2264 阅读 · 0 评论 -
【C++ Priemr | 15】虚函数表剖析(三)
一、虚拟菱形继承#include <iostream>using namespace std;class B {public: int _b;};class C1 :virtual public B {public: int _c1;};class C2 :virtual public B {public: int _c2;};...原创 2019-04-18 18:39:28 · 238 阅读 · 0 评论 -
一个C++程序执行main函数前和执行完main函数后会发生什么。
总结:main函数执行之前,主要就是初始化系统相关资源:设置栈指针 初始化static静态和global全局变量,即data段的内容 将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容 运行全局构造器,估计是C++中构造函数之类的吧 将main函数的参数,argc,argv等传递给main函数,然后才...原创 2019-09-01 15:02:13 · 644 阅读 · 1 评论 -
一个类的指针指向NULL去访问该类的成员函数
对象指针为NULL,为什么还是可以调用成员函数原创 2019-09-01 21:35:13 · 615 阅读 · 0 评论 -
【C++ Primer | 0 】字符串函数实现
1. memcpy函数原型:void* memcpy(void* dst, const void* src, size_t size);void* memmove(void* dst, const void* src, size_t size);分析:source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保...原创 2019-04-14 15:48:08 · 581 阅读 · 0 评论 -
map与unordered_map
时间复杂度: map unordered_map Ordering increasing order noorder Implementation Self balancing BST Hash Table search time log(n) O(1): 平均水ping O(n):最糟糕情况 Ins...原创 2019-05-22 10:02:31 · 177 阅读 · 0 评论 -
【C++ Primer | 09】容器适配器
一、stacks.push(): 向栈内压入一个成员;s.pop(): 从栈顶弹出一个成员;s.empty(): 如果栈为空返回true,否则返回false;s.top(): 返回栈顶,但不删除成员;s.size(): 返回栈内元素的大小;二、queues.back() 返回队尾元素s.empty() ...原创 2019-05-13 21:53:49 · 1141 阅读 · 2 评论 -
【C++ Priemr | 15】面向对象程序设计
类型准换与继承为了支持c++的多态性,才用了动态绑定和静态绑定。需要理解四个名词:对象的静态类型:对象在声明时采用的类型,是在编译期确定的。 对象的动态类型:目前所指对象的类型,是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。关于对象的静态类型和动态类型,看一个示例:class B {}class C : public B {}class D : pu...原创 2019-04-18 15:28:27 · 193 阅读 · 0 评论 -
【C++ Priemr | 15】构造函数与拷贝控制
继承的构造函数1. 简介:子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递。如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数。class Base{public: Base(int va) : m_value(va), m_c(‘0’) {} Base(char c) : m_c(c),...原创 2019-04-18 14:59:28 · 207 阅读 · 0 评论 -
【第15章】多重继承
1. 虚基类介绍多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如非常经典的菱形继承层次。如下图所示:类A派生出类B和类C,类D继承自类B和类C,这个时候类A中的成员变量和成员函数继承到类D中变成了两份,一份来自 A-->B-->D 这一路,另一份来自 A-->C-->D 这一条路。在一...原创 2019-04-17 16:04:54 · 186 阅读 · 0 评论 -
智能指针
一、请简述智能指针原理,并实现一个简单的智能指针。/*** 智能指针,简单来讲是使用引用计数的方法,来跟踪监控指针。当引用计数为0时就delete 所跟踪的目标指针,释放内存* 智能指针将一个指针封装到一个类中,当调用智能指针的拷贝构造函数时,将引用计数+1(因为新创建的智能指针也引用了目标指针)* 重载智能指针的赋值操作符,等号左边的对象引用计数-1,右边的对象引用计数+1,...原创 2019-04-17 13:49:43 · 110 阅读 · 0 评论 -
【C++ Priemr | 15】虚函数常见问题
1. 在成员函数中调用虚函数:#include <iostream>using namespace std;class CBase{public: void func1() { func2(); } virtual void func2() { cout << "CBase::func2()" << ...原创 2019-05-24 17:35:15 · 260 阅读 · 0 评论 -
【C++ Primer | 16】容器适配器全特化、偏特化
上面对模板的特化进行了总结。那模板的偏特化呢?所谓的偏特化是指提供另一份模板定义式,而其本身仍为模板;也就是说,针对模板参数更进一步的条件限制所设计出来的一个特化版本。这种偏特化的应用在STL中是随处可见的。比如1.测试代码:#include <iostream>using namespace std;namespace templateTest { //模...原创 2019-06-27 15:16:53 · 225 阅读 · 0 评论 -
【C++ Priemr | 15】虚函数表剖析(二)
一、多重继承(无虚函数覆盖)下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。测试代码:class Base1{public: virtual void f() { cout << "Base1::f" << endl; } //虚函数定义 virtual void g() { ...原创 2019-05-05 14:30:49 · 283 阅读 · 0 评论 -
循环引用
1. 测试代码#include <iostream>#include <memory>using namespace std;class B;class A {public: shared_ptr<B> pb; ~A() { cout << "kill A\n";}};class B {public: ...原创 2019-06-26 20:00:30 · 189 阅读 · 0 评论 -
【C++ Primer | 16】std::move和std::forward、完美转发
右值引用应该是C++11引入的一个非常重要的技术,因为它是移动语义(Move semantics)与完美转发(Perfect forwarding)的基石:移动语义:将内存的所有权从一个对象转移到另外一个对象,高效的移动用来替换效率低下的复制,对象的移动语义需要实现移动构造函数和移动赋值运算符。 完美转发:定义一个函数模板,该函数模板可以接收任意类型参数,然后将参数转发给其它目标函数,且保...原创 2019-06-26 16:41:56 · 515 阅读 · 0 评论 -
C++ 内存管理机制
内存分配方式简介在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一...转载 2019-06-26 11:10:30 · 2563 阅读 · 0 评论 -
【C++ Primer | 08】IO库
一、istringstream类描述:从流中提取数据,支持>>操作这里字符串可以包括多个单词,单词之间使用空格分开#include <iostream> #include <sstream> using namespace std;int main(){ istringstream istr("1 56.7"); ...原创 2019-05-17 12:39:09 · 125 阅读 · 0 评论 -
dynamic_cast
1. 测试代码:#include <iostream>using namespace std;class Base{public: Base() {}; virtual void Show() { cout << "This is Base calss"; }};class Derived :public Base{public: ...原创 2019-05-11 17:30:36 · 175 阅读 · 0 评论