Android之性能监控框架
[TOC]
文章参考:https://blog.csdn.net/ring0hx/article/details/1605254
概述Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如下面例子中的函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。
当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。(关于虚拟机制是如何实现的,参见Inside the C++ Object Model ,Addison Wesley 1996)
12345678910111213141516171819202122232425#include <iostream>using namespace std;class Base {public: Base() {}p ...
C++深拷贝和浅拷贝学习
[TOC]
概述文章参考:http://c.biancheng.net/view/2336.html
对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如:
123456789101112131415class Base{public: Base(): m_a(0), m_b(0){ } Base(int a, int b): m_a(a), m_b(b){ }private: int m_a; int m_b;};int main(){ int a = 10; int b = a; //拷贝 Base obj1(10, 20); Base obj2 = obj1; //拷贝 return 0;}
b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 memcpy() 函数的效果非 ...
Android之性能监控框架
[TOC]
文章参考:http://c.biancheng.net/cpp/biancheng/view/3297.html
概述隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。
但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用( ),而( )在代码中随处可见,所以也不利于使用文本检索工具(例如 Windows 下的 Ctrl+F、Linux 下的 grep 命令、Mac 下的 Command+F)定位关键代码。
为了使潜在风险更加细化,使问题追溯更加方便,使书写格式更加规范,C++ 对类型转换进行了分类,并新增了四个关键字来予以支持,它们分别是:
关键字
说明
static_cast
用于良性转换,一般不会导致意外发生,风险很低。
const_cast
用于 const 与非 const、volatile 与非 volatile 之间的转换。
reinterpret_cast
高度危险的转换,这种转换仅仅是对二 ...
Android之性能监控框架
[TOC]
概述如果一个类定义在另一个类的内部,这个内部类就叫做内部类。此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。即说:
内部类就是外部类的友元类(不需要特意在外部类中声明)。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
外部类与内部类其实联系并不大,外部类无非仅仅限定了内部类类名的作用域范围。
内部类可以定义在外部类的 public、protected、private 都是可以的。
如果内部类定义在 public,则可通过 外部类名::内部类名 来定义内部类的对象。
如果定义在 private,则外部不可定义内部类的对象,这可实现“实现一个不能被继承的类”问题。
内部类使用定义一个内部类:
123456789101112131415161718192021222324252627282930313233using namespace std;class Outer {public: Outer() {m_outerI ...
++引用基础学习
[TOC]
概述引用(Reference)是C++语言相对于C语言的又一个扩充,是C++常用的一个重要内容之一。类似于指针,只是在声明的时候用”&”取代了”*”。正确、灵活地使用引用,可以使程序简洁、高效。我在工作中发现,许多人使用它仅仅 是想当然,在某些微妙的场合,很容易出错,究其原由,大多因为没有搞清本源。故在本篇中我将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖 引玉的作用。
引用
引用是别名,在声明时必须初始化,在实际代码中主要用作函数的形参
(1)&在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。ra=1; 等价于 a=1;
(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址, ...
C++中引用传递、指针传递、值传递的区别
[TOC]
概述文章参考:https://blog.csdn.net/loongkingwhat/article/details/82469423
值传递形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
但是需要记住:值传递存在拷贝过程
指针传递指针参数传递本质上就是值传递,只不过它传递的是一个地址值。形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
指针传递过程中,被调用函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间存放主调函数传递进来的实参的值。从而形成了实参的一个副本(替身)。值传递的特点是:被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值(形参指针变了。实参指针不会变)
引用传递形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进 ...
C++中引用作为函数的返回值
[TOC]
文章参考:https://www.zhihu.com/question/353263548
概述通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用,方式与返回一个指针类似。当函数返回一个引用时,则返回一个指向返回值的隐式指针。用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本。
使用方法引用作为返回值,须遵守以下规则:
不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了”无所指”的引用,类似于野指针,程序会进入未知状态。
不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
可以返回类成员的引用,但最好是 const,这样可以避免在无意的情况下破坏该类的成员。
下面通过一段程序详细说明其用法:
12345678910111213141516171819202122232425 ...
面试题-C++中指针和引用的区别
[TOC]
文章参考:https://developer.aliyun.com/article/709155#slide-2
概述指针和引用主要有以下区别:
指针本质上指针是一个变量,只不过这个变量存储的是另一个变量的地址,我们通过访问这个地址来修改变量。所在他在逻辑上和真实的变量是独立。它可以被改变,包括其所指向的地址的改变,或者是其指向地址的所存放的数据的改变。
引用引用只是一个别名,还是变量本身。对引用进行的任何操作就是对变量本身进行操作,因此以达到修改变量的目的。他在逻辑上不是独立的,它就是代表变量本身,所在他的存在具有依附性。这个也很好理解,它只是给一个变量起了一个别名,但是首先得有一个变量才能起别名啊!所以引用一开始就必须被初始化。而且其引用的对象在整个生命周期不能被改变(自始至终只能依附于一个变量)
指针和引用的使用在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:
指针传递:指针传递参数本质上是 值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放 ...
C++中多态与虚函数
[TOC]
概述文章参考:https://www.cnblogs.com/zhaozhibo/p/14982253.html
文章参考:https://zhuanlan.zhihu.com/p/104379345
C++虚函数和纯虚函数的区别
[TOC]
概述定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
代码示例:
12345678910111213141516171819202122class A{public: virtual void foo() { cout<<"A::foo() is called"<<endl; }};class B:public A{public: void foo() { cout<<"B::foo() is called"<<endl; }};int main(void){ A *a = new B(); a->foo(); / ...