C++深究

函数指针

double pam(int, double); // prototype
double (*pf)(int, double); // declare function pointer
pf = pam; // pf now points to the pam() function
double y = (*pf)(1, 5); // call pam() using pointer pf

内联函数

适用范围:不是递归调用的函数;函数多次被调用;

inline double square(double x) {
return x * x;
}

函数模板

// non template function prototype
void Swap(job &a, job &b);
// template prototype
temple<class T>
void Swap(T &a, T &b);
// explicit specialization for the job type
template<> void Swap<job>(job &a, job &b);

关键字decltype

int x;	double y;
decltype(x + y) xpy; // make xpy the same type as x + y

关键字explicit

作用:防止隐式转换

class A {
private:
string s;
public:
A(string _s = "") : s(_s) {}
int compare(const A& other);
}; class B {
private:
string s;
public:
explicit B(string _s = "") : s(_s) {}
int compare(const B& other);
}; int main() {
A a;
a.compare("Valid"); // Is valid to do that
B b;
b.compare("InValid"); // Is invalid to do that
return 0;
}

关键字auto

作用:自动推导变量类型

vector<int> v;
auto it = v.begin();

运算符dynamic_cast

作用:判断指针pg的类型是否被安全地转换为Superb*。如果可以,运算符将返回对象的地址,否则返回一个空指针。

class Superb : public Grand {...}
Grand *pg = new Grand;
Superb *pm = dynamic_cast<Superb*>(pg);

运算符typeid

作用:确定两个对象是否为同种类型

typeid(Grand) == typeid(*pg);

运算符const_cast

作用:删除const typename* 中的const,当且仅当指向的值的声明是非const的时候有效

void change(const int *pt, int n) {
int *pc = const_cast<int*>(pt);
*pc += n;
}
int pop1 = 38383;
change(&pop1, -103); // valid
const int pop2 = 2000;
change(&pop2, -103); // invalid

运算符static_cast

作用:可隐式转换的时候才生效

High bar;
Low blow;
High *pb = static_cast<High*>(&blow); // valid
Low *pl = static_cast<Low*>(&bar); // valid
Pond *pmer = static_cast<Pond*>(&blow); // invalid

运算符reinterpret_cast

作用:天生危险的类型转换

struct dat {short a, b};
long value = 0xaaaaaaaa;
dat *pd = reinterpret_cast<dat*>(&value); // valid

智能指针auto_ptr

作用:离开作用域的时候自动调用析构函数释放动态内存

void function() {
auto_ptr<double> ap(new double);
*ap = 2.333;
return;
}

智能指针shared_ptr

作用:跟踪引用特定对象的智能指针数,当最后一个指针过期时,才调用delete

智能指针unique_ptr

作用:唯一所有权(ownship),不允许智能指针直接拷贝赋值

Lambda函数

作用:允许使用匿名函数

说明:&表示引用变量,=表示取值变量

[](int x) {return x % 3 == 0;}
bool f(int x) {return x % 3 == 0;}
[&count, =sock]() {count++;}

包装器function

作用:用作形式参数,作为一个function包装器对象

template<class T>
T use_f(T v, std::function<T(T)> f); function<double(int, char)> f;
// 等价于
double f(int, char);

可变参数模板

作用:传递未知数量的参数

void print() {}

template<class T>
void print(T value) {
std::cout << value << std::endl;
} template<class T, class... Args>
void print(T value, Args... args) {
std::cout << value << ", ";
print(args...);
}

C++的技术探究的更多相关文章

  1. (转)Java动态追踪技术探究

    背景:美团的技术沙龙分享的文章都还是很不错的,通俗易懂,开阔视野,后面又机会要好好实践一番. Java动态追踪技术探究 楔子 jsp的修改 重新加载不需要重启servlet.如何在不重启jvm的情况下 ...

  2. 网站相关技术探究keepalive_timeout(转)

    网站相关技术探究keepalive设多少: /proc/$PID/fd/$number  0:标准输入 1:标准输出 2:标准错误   Test: [root@KTQT ~]# ll /proc/12 ...

  3. Java动态追踪技术探究(动态修改)

    Java动态追踪技术探究 Java探针-Java Agent技术-阿里面试题 秒懂Java动态编程(Javassist研究) 可以用于在类加载的时候,修改字节码. Java agent(Java探针) ...

  4. commons-pool2 池化技术探究

    一.前言 我们经常会接触各种池化的技术或者概念,包括对象池.连接池.线程池等,池化技术最大的好处就是实现对象的重复利用,尤其是创建和使用大对象或者宝贵资源(HTTP连接对象,MySQL连接对象)等方面 ...

  5. Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析

    一.前言 之前介绍了Android直播视频中一种视频源数据采集:摄像头Camera视频数据采集分析 中介绍了利用Camera的回调机制,获取摄像头的每一帧数据,然后进行二次处理进行推流.现在我们在介绍 ...

  6. Android中直播视频技术探究之---采集摄像头Camera视频源数据进行推流(采用金山云SDK)

    一.前言 在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进 ...

  7. Android中直播视频技术探究之---摄像头Camera视频源数据采集解析

    一.前言 在视频直播中一般都是两种视频数据源,一个是摄像头数据,一个是录制桌面数据,而一般来说美女妹子直播都是来自于摄像头数据,游戏直播都是录制桌面数据的,那么今天就来看看第一个数据源数据采集分析,A ...

  8. Android中直播视频技术探究之---视频直播服务端环境搭建(Nginx+RTMP)

    一.前言 前面介绍了Android中视频直播中的一个重要类ByteBuffer,不了解的同学可以 点击查看 到这里开始,我们开始动手开发了,因为我们后续肯定是需要直播视频功能,然后把视频推流到服务端, ...

  9. Android中直播视频技术探究之---基础知识大纲介绍

    一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...

  10. Java动态追踪技术探究

    引子 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话: “Debug一下吧.” “线上机器,没开Debug端口.” “看日 ...

随机推荐

  1. Docker初次使用与安装过程

    Docker入门 Docker 简介 Docker有两个版本: 社区版(CE) 企业版(EE) Docker Community Edition(CE)非常适合希望开始使用Docker并尝试使用基于容 ...

  2. SpringBoot结合swagger2快速生成简单的接口文档

    1. pom.xml中加入依赖 <dependency> <groupId>com.spring4all</groupId> <artifactId>s ...

  3. github小白上传本地代码及更新代码到GitHub及华为云教程

    上传本地代码 第一步:去github上创建自己的Repository,创建页面如下图所示: 红框为新建的仓库的https地址 第二步: echo "# Test" >> ...

  4. Android-Activity启动流程

    http://www.jianshu.com/p/6037f6fda285 zygote是什么?有什么作用? zygote意为“受精卵“. 在Android系统里面,zygote是一个进程的名字.An ...

  5. oracle 中如何查询当前用户可以看到的表名、表对应的所有字段

    前言:利用 oracle 的视图来查询表的相关信息. oracle 查询当前用户下的表名 + 表注释 select t.table_name tableName, f.comments comment ...

  6. RequestDispatcher.forward转发与HttpServletResponse.sendRedirect重定向

    下面是HttpServletResponse.sendRedirect 方法实现的请求重定向与RequestDispatcher.forward 方法实现的请求转发的总结比较:(1)RequestDi ...

  7. lamp配置多个虚拟站点

    在同一ip下添加多个域名站点! 1.查看ip 命令:ifconfig 2.添加域名 命令:vi /etc/hosts 输入域名:如 192.168.160.127   www.test.com 192 ...

  8. 【读书笔记】iOS-网络-应用间通信

    一,URL方案 URL方案有3个主要用途:根据设备上其他应用的存在与否调整逻辑,切换到其他应用以及响应打开你的应用的其他应用.你还可以通过URL方案从某个站点或是在基于Web的认证流程结束是打开应用. ...

  9. js柯里化

    这篇文章讲的很好啊~例子很好 http://www.zhangxinxu.com/wordpress/2013/02/js-currying/ 这篇是讲函数式编程的,其中也有涉及到,说明了柯里化是一种 ...

  10. iOS设计模式-原型模式

    | 导语 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 通过深复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象.这个指定的对象可被称为“原型”对象,也就是通过复制原型 ...