OpenGL ES3中部分API学习
[TOC]
概述OpenGL 支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,必须查索引表。RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。
下面,我们来学习一下OpenGL ES3中的部分常用的API
glClearColor()、glClear()、glColor()、glShadeModel()、glClearDepth()、glDepthFunc()
常用API学习1、glClearColor() 设置颜色缓存的清除值
glClearColor ( ) 就是用来设置这个 “ 底色 ” 的,即所谓的背景颜色。glClearColor ( ) 只起到Set 的作用,并不Clear 任何。
12//红、绿、蓝和 alpha 值,指定值范围均为[ 0.0f,1.0f ]void glClearColor(GLfloat red, GLfloat g ...
C++继承与派生基础学习
[TOC]
概述构造方法是用来初始化类对象的。如果在类中没有显式地声明构造函数,那么编译器会自动创建一个默认的构造函数;并且这个默认的构造函数仅仅在没有显式地声明构造函数的情况下才会被创建创建。
构造函数与父类的其它成员(成员变量和成员方法)不同,它不能被子类继承。因此,在创建子类对象时,为了初始化从父类中继承来的成员变量,编译器需要调用其父类的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么是显式调用,下面会详细说明!
下面我们将从以下四种情况讲解c++子类构造函数初始化及父类构造初始化:
构造函数初始化1.父类没有声明构造函数(1) 子类也没有声明自己的构造函数,则父类和子类均由编译器生成默认的构造函数。
(2) 子类中声明了构造函数(无参或者带参),则子类的构造函数可以写成任何形式,不用顾忌父类的构造函数。在创建子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。
2.父类只声明了无参构造函数如果子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调 ...
Android之性能监控框架
[TOC]
文章参考:http://c.biancheng.net/view/2299.html
概述虚函数基础在《C++将派生类赋值给基类(向上转型)》一节中讲到,基类的指针也可以指向派生类对象,请看下面的例子:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <iostream>using namespace std;//基类Peopleclass People{public: // 构造函数 People(char *name, int age); void display();protected: char *m_name; int m_age;};People::People(char *name, int age): m_name(name), m_age(age){}void People::display(){ cout<&l ...
Android之性能监控框架
[TOC]
概述在C++中,可以将虚函数声明为纯虚函数,语法格式为:
1virtual 返回值类型 函数名 (函数参数) = 0;
纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。
最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。
包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。
抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。
纯虚函数使用举例:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include <iostream>using namespace std;//线class Line{public ...
Android之性能监控框架
[TOC]
文章参考:https://mp.weixin.qq.com/s/mQsDlx1dSVaF_ou9KNRdYg
概述多态
定义:“一个接口,多种方法”,程序在运行时才决定调用的函数。
实现:C++多态性主要是通过虚函数实现的,虚函数允许子类重写override(注意和overload的区别,overload是重载,是允许同名函数的表现,这些函数参数列表/类型不同)。
目的:接口重用。封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。
用法:声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。
虚函数表多态是由虚函数实现的,而虚函数主要是通过虚函数表(V-Table)来实现的。
如果一个类中包含虚函数(virtual修饰的函数),那么这个类就会包含一张虚函数表,虚函数表存储的每一项是一个虚函数的地址。如下图:
虚指针(vptr):这个类的每一个对象都会包含一个虚指针(虚指针存在于对象实例地址的最前面,保证虚函数表有最高的性能),这个虚指针指向虚函数表。 ...
C++11之array数组基础学习
[TOC]
概述
C++基础之数组长度计算
[TOC]
文章参考:https://haicoder.net/cpp/cpp-array-length.html
概述对于C数组,C++没有提供方法直接计算其size,可以借助sizeof() 、begin()、end()间接的计算其长度。
使用sizeofsizeof是一个关键字,它是一个编译时运算符,用于计算变量或数据类型的字节大小。
12345678910int main(int argc, char *argv[]){ int arr[] {2,6,3,1,9,8,10,5,4,0}; int length = sizeof (arr) / sizeof (arr[0]); std::cout << "array arr's length =" << length<< std::endl; return 0;}
使用begin(),end()1234567891011int main(int argc, cha ...
C++11之array数组基础学习
[TOC]
概述array 容器以类模板的形式定义在 <array> 头文件,并位于命名空间 std 中,如下所示:
1234namespace std{ template <typename T, size_t N> class array;}
因此,在使用该容器之前,代码中需引入<array> 头文件,并默认使用 std 命令空间,如下所示:
12#include <array>using namespace std;
在 array<T,N> 类模板中,T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,需要注意的是,这里的 N 必须是常量,不能用变量表示。
array 容器有多种初始化方式,如下代码展示了如何创建具有 10 个 double 类型元素的 array 容器:
1std::array<double, 10> values;
通过如下创建 array 容器的方式,可以将所有的元素初始化为 0 或者和默认元素类型等效的值:
1std::array&l ...
C++语言指针的基础学习
[TOC]
概述C++中除了指定变量名称来存取数据之外,在计算机的运行中也有针对内存地址存取的工具,即指针(Pointer)。指针本身是一种变量类型,存储的内容就是内存的地址。大家可以想象把身份证号码当成变量的地址,有了身份证号码,自然就可以知道该位人士的个人资料(变量内容)了。通过指针变量,程序就可以直接存取该指针变量所指向的地址内容。
在C++中,定义变量之后,系统就会开始为此变量分配内存空间,以供程序使用。当需要使用某个数据时,存取那一个地址的内存空间即可。如果我们要更清楚地了解变量所在内存的地址,可以通过&(取址运算符)来得到变量所在的地址,语法格式如下:
1&变量名称;
1234567891011121314151617181901 #include <iostream>02 #include <cstdlib>0304 using namespace std;0506 int main()07 {08 int num1 = 10;09 char ch1[2] = "A" ...
C++智能指针基础学习
[TOC]
概述文章参考:https://mp.weixin.qq.com/s/glLPkBwWYlY9z_u-Iubgvg
C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念。
这里不置贬褒,手动分配内存与手动释放内存有利也有弊,自动分配内存和自动释放内存亦如此,这是两种不同的设计哲学。有人认为,内存如此重要的东西怎么能放心交给用户去管理呢?而另外一些人则认为,内存如此重要的东西怎么能放心交给系统去管理呢?
在 C/C++ 语言中,内存泄露的问题一直困扰着广大的开发者,因此各类库和工具的一直在努力尝试各种方法去检测和避免内存泄露,如 boost,智能指针技术应运而生。
智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的 ...