C++
Zhoujy1996
这个作者很懒,什么都没留下…
展开
-
继承体系中同名成员函数的关系
继承体系中同名成员函数的关系重载 必须在同一作用域函数名相同、参数列表不同与函数返回值类型无关重写(覆盖) 是指子类重新定义父类虚函数的方法处在不同的作用域:分别在基类和派生类中函数名相同、参数列表相同、返回值相同必须有 virtual 关键字访问修饰符可以不同重定义(隐藏) 指派生类的函数遮蔽了与其同名的基类函数处在不同的作用域中,分别在基类和派生类中函数名相同,...原创 2018-06-27 16:04:01 · 517 阅读 · 0 评论 -
输入和输出运算符重载
输入和输出运算符重载重载输出运算符 <<通常情况下,输出运算符的第一个形参是一个非常量 ostream 对象的引用。之所以 ostream 是非常量是因为向流写入内容会改变其状态;而该形参是引用是因为我们无法直接复制一个 ostream 对象。 第二个形参一般来说是一个常量的引用,该常量是我们想要打印的类类型。 为了与其他输出运算符保持一致,poerat...原创 2018-06-23 10:57:08 · 1893 阅读 · 0 评论 -
为什么C++里调用虚函数比调用普通函数慢?
为什么C++里调用虚函数比调用普通函数慢?原因: - 运行时需要得到对应类的函数的地址 - 当在用父类的引用或者指针调用虚函数时,会先从该对象的头部取到虚函数的地址(C++标准规定虚函数表地址必须放最前),再从虚函数表中取到实际要调用的函数的地址,最终调用该函数 - 调用虚函数,相比普通函数,实际上多了三条指令:取虚表,取函数地址,call调用。 - 影响cpu流水线 ...原创 2018-06-07 21:34:56 · 1430 阅读 · 0 评论 -
运行时多态的实现-虚函数
运行时多态的实现-虚函数多态分为编译时多态和运行时多态;编译时多态为重载和模板,运行时多态是通过虚函数实现的。 例如我们看下面一个例子: 我们定义一个指向基类的指针,但是我们希望通过对于不同的对象可以有不同的输出结果。class Base{public: Base(string data) :m_data(data){} void show(){ cout <...原创 2018-06-05 20:47:05 · 5854 阅读 · 0 评论 -
new/delete与malloc/free的区别
new/delete与malloc/free的区别new/delete是C++操作符,malloc/free是库函数new分配内存按照数据类型进行分配,malloc分配内存按照大小分配new在动态分配内存的时候可以初始化对象,调用其构造函数,delete在释放内存时调用对象的析构函数。 而malloc只分配一段给定大小的内存,并返回该内存首地址指针,如果失败,返回NULL。new/...原创 2018-06-05 20:18:49 · 279 阅读 · 0 评论 -
虚函数的作用和实现原理
虚函数的作用和实现原理 - 虚函数实现原理:虚函数表、虚函数指针 - 虚函数的作用:当调用一个虚函数时,被执行的代码必须和调用函数的对象的动态类型相一致。 - 当一个类声明了虚函数或者继承了虚函数,这个类就会有自己的虚函数表。虚函数表实际上就是一个函数指针数组,有的编译器用的是链表。虚函数表数组中的每一个元素对应一个函数指针指向该类的一个虚函数,同时该类的每一个对象都会包含一个虚函数表指...原创 2018-06-04 21:53:57 · 2553 阅读 · 0 评论 -
内联函数、构造函数、静态成员函数不可以定义为虚函数
内联函数、构造函数、静态成员函数不可以定义为虚函数内联函数是编译时展开函数体,所以在此时就需要有实体,而虚函数是运行时才有实体,所以内联函数不可以为虚函数。 静态成员函数是属于类的,不属于任何一个类的对象,可以通过作用域以及类的对象访问,本身就是一个实体,所以不能定义为虚函数。如果构造函数定义为虚函数,则需要通过查找虚函数表来进行调用。但是构造函数是虚函数的情况下是找不到的,因为构造函数...原创 2018-06-03 19:02:45 · 3214 阅读 · 3 评论 -
虚析构函数的作用
析构函数的作用类的析构函数是为了释放内存资源,析构函数不被调用的话就会造成内存泄漏。虚析构函数定义为虚析构函数是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。 但并不是要把所有类的析构函数都写成虚函数。只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。示例代码:class Base{public: Base(string da...原创 2018-06-03 13:43:58 · 10016 阅读 · 2 评论 -
C++中虚函数的作用和实现原理
虚函数的作用和实现原理虚函数实现原理:虚函数表、虚函数指针虚函数的作用:当调用一个虚函数时,被执行的代码必须和调用函数的对象的动态类型相一致。当一个类声明了虚函数或者继承了虚函数,这个类就会有自己的虚函数表。虚函数表实际上就是一个函数指针数组,有的编译器用的是链表。虚函数表数组中的每一个元素对应一个函数指针指向该类的一个虚函数,同时该类的每一个对象都会包含一个虚函数表指针,虚函数表指...原创 2018-05-31 21:28:32 · 2781 阅读 · 1 评论 -
析构函数是否能抛出异常?
析构函数是否能抛出异常?C++标准指明析构函数不能、也不应该抛出异常。 C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是调用这些对象的析构函数来完成释放资源的任务,所以从这个意义上说,析构...原创 2018-05-30 21:47:42 · 742 阅读 · 0 评论 -
C++后台开发面试常见问题汇总
博客转载于:http://blog.csdn.net/shanghairuoxiao/article/details/72876248c和c语言基础参考书籍:《C++ primer》,《effective C++》,《STL源码解析》,《深度搜索C++对象模型》extern关键字作用extern声明变量在在外部定义?extern修饰函数?extern C的作用?用法?s...转载 2018-05-21 21:41:17 · 359 阅读 · 0 评论 -
C++ 读取 .txt 文件信息
今天,一位朋友问我如何将文件中的数据读取到数组中,想来自己好久没有编写过有关文件操作的代码,就编写了一小段代码。 代码:#include <iostream> #include <fstream> int main(){ fstream file("test.txt"); //创建一个fstream,打开名为"test...原创 2018-05-17 22:31:42 · 646 阅读 · 0 评论 -
类的 static 成员
类的静态成员静态成员可以是public 或 private静态成员函数也不与任何对象绑定在一起,它们不包含this指针。作为结果,静态成员函数不能声明为const的,而且我们也不能在static函数体内使用this指针。也意味着它们不是类的构造函数初始化的。我们使用作用域运算符直接访问静态成员: class A{static void func();} auto r = A::fun...原创 2018-05-16 21:53:44 · 435 阅读 · 0 评论 -
函数的参数传递位数组时,如何传递
数组作为形参传递初学者刚学完数组后,需要将数组作为参数传递时,会直接将数组作为参数传递,实际上数组作为形参传递时,是以指针传递的。void print(int* a);void print(int a[]);//尽管形式不同,但是上面两个函数是等价的,每个函数的唯一形参都是 int* 类型使用数组作为形参的函数也必须确保使用数组不会越界。管理指针形参的三种方法: ...原创 2018-05-13 22:31:17 · 700 阅读 · 0 评论 -
一个结构体占用内存大小的问题
sizeo(结构体)的大小问题先来看下面的示例代码:struct Demo{ int a; int b;};int main(){ cout<<"Demo size = " << sizeof(Demo)<<endl; return 0;}毫无疑问,都会说,结果为 8 这时我提出一个问题?请问在32位和...原创 2018-05-12 22:49:22 · 2612 阅读 · 0 评论 -
函数的实参与形参问题
函数的实参与形参问题相信对于新手来说,刚开始学习编程时,对于实参形参会有些搞不清楚,经常在写函数时搞混。形参的值传递和引用传递首先我们来看一个例子://这个函数的形参没有取引用,所以只是将实参的值赋予给形参,改变形参的值,并不会改变实参的值void func(vector&amp;lt;int&amp;gt; v){ for (auto it = v.begin(); it != v....原创 2018-05-11 22:49:54 · 604 阅读 · 0 评论 -
比较 int *p[10] 和 int (*p)[10]的区别:
比较 int *p[10] 和 int (*p)[10]的区别:int *p[10]:整型指针的数组 代表一个数组里面存放着四个整型指针int (*p)[10]:指向含有4个整数的数组 这是一个存放四个整型数的数组 可以这样操作: (*p)[0] = 99; //表示将数组首元素赋值为99...原创 2018-05-10 13:40:16 · 1252 阅读 · 0 评论 -
使用迭代器运算的经典算法----二分搜索
使用迭代器运算的经典算法 二分搜索二分搜索是从有序序列中寻找某个给定的值算法分析:从序列中间的位置开始搜寻,如果中间的正好是目标元素,则搜索完成; 若 < 目标元素,则在后半部分搜索,若 > 目标元素,则在前半部分搜索,重复此过程,直到找到或没有元素供搜索。示例代码:int main(){ int i = 1; vector<int> ...原创 2018-05-10 13:32:01 · 434 阅读 · 0 评论 -
迭代器失效问题
迭代器失效使用迭代器时需要注意: <1>不能在范围for循环中向vector对象添加元素 <2>任何可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效谨记:凡是使用了迭代器的循环体,都不要向迭代器所属的容器中添加元素...原创 2018-05-10 13:21:02 · 447 阅读 · 1 评论 -
C++11特性--范围 for 语句
C++11特性–范围 for 语句作用: 遍历给定序列中的 每个元素并对序列中的每个值执行某种操作,语法形式为: for (declartion : expression) statementexpressin是一个对象,用于表示一个序列declaration定义一个变量,用于访问元素,每次迭代,变量都会被初始化下一个元素的值。例: st...原创 2018-05-09 22:43:21 · 194 阅读 · 0 评论 -
decltype 关键字
decltype类型指示符作用是选择返回操作数的数据类型,分析表达式得到它的类型,但不得到它实际的值 例: decltype(fun()) sum = x //sum的类型就是函数的返回类型如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const 和引用在内)const int a = 0, &b = a; decltype...原创 2018-05-09 22:30:51 · 375 阅读 · 0 评论 -
C++11特性 auto 关键字
auto类型说明符(自动推导数据类型)auto让编译器通过初始值来推算变量的类型,显然auto变量必须有初始值 例如 auto str = “helloworld”;auto也能在一条语句中声明多个变量,但是所有变量的初始类型必须一样 例如 auto i = 99, n = 10;auto一般会忽略顶层const,保留底层const,如果希望推断出来的类型是顶层const,需要指出...原创 2018-05-09 22:26:48 · 249 阅读 · 0 评论 -
TCP和UDP区别、
key:TCP是一种面向连接的、可靠的、字节流服务1.面向链接:TCP面向链接,面向连接意味着两个使用TCP的应用(通常是一个客户和一 个服务器)在彼此交换数据之前必须通过三次握手先建立一个TCP连接。 在一个TCP中仅有两方彼此通信,多播和广播不能用于TCP。 UDP是不可靠的传输,传输前不需要建立链接,可以应用多播和广播实现一对多...原创 2018-05-07 12:43:42 · 231 阅读 · 0 评论 -
内存分配方式
内存分配方式有三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。 例如全局变量,static变量。(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建, 函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令 集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态...原创 2018-05-07 12:38:40 · 182 阅读 · 0 评论
分享