格式工厂(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。

本节主要介绍C++的新特性,对于C++的基础语法不再讲解.由于编译器的不同.在某些地方可能有些差异,但是无太大影响.

讲解本节知识之前先确认你的C++支持度[__cplusplus]

#include <iostream>
int main(int argc, const char * argv[]) {
    std::cout<<__cplusplus<<std::endl;
    return 0;
}  

会看到这样,说明支持C++11



新特性 1  模板套模板

在旧版本的C++中模板套用模板可能要加空格,像这样

vector<list<int> > //旧板中需要加空格
vector<list<int>>  //新模板中不需要加


新特性 2  空指针

新规定中nullptr可以代替0和NULL(0指针)

void f(int)   { cout << "f(int) be called" << endl; }
void f(void*) { cout << "f(void*) be called" << endl; }

f(0);       //calls f(int)
f(NULL);    //calls f(int) if NULL is 0
f(nullptr); //calls f(void*) 


新特性 3  新auto

1.自动识别类型(编译器的实参推倒)

auto i = 42; //自动识别 i为 int
auto d = func(); //自动识别d为函数返回值

2.如果初始化表达式是引用,则去除引用语义.如果auto关键字带上&号,则不去除const语意

int a = 10;
int &b = a;

auto c = b;//c的类型为int而非int&(去除引用)
auto &d = b;//此时c的类型才为int&

3.如果初始化表达式为const或volatile,则除去const/volatile语义.

const int ci=i,&cr=i;
auto a=ci;      //a为int(忽略顶层const)
auto b=cr;      //b为int(忽略顶层const,cr是引用)
auto c=&i;      //c为int *
auto d=&ci;     //d是pointer to const int(&ci为底层const

4.初始化表达式为数组时,auto关键字推导类型为指针.

int main()
{
    int array[3]{ 1, 2, 3 };
    auto array_b = array;
    std::cout << typeid(array_b).name() << std::endl;

    return 0;
}

输出结果Pi(int*)

注意事项

1.auto声明的变量必须要初始化,否则编译器不能判断变量的类型.

2.auto不能被声明为返回值(但可以与decltype结合使用做返回值的站位下文有),auto不能作为形参,auto不能被修饰为模板参数



新特性 4  新初始化

C++11之前的初始化

Rect r1 = {3,7,20,25};//大括号
Rect r2(3,7,20,25) ;//小括号
int arry[3] = {1,2,3};//[]

C++11之后一切的初始化都可以用 {} 代替

int value[] {1,2,3};
vector<int> v {1,2,3};
complex<double> c {1,2,3};

新初始化的优点

int i; //初始值不知道
int i{}; //初始值是0
int * p;//初始值不知道
int * p{}; //初始值是nullptr

//{}  不允许窄化转换
int x1(5.3);它会被初始化为5
int x2{5.3};它会报错


新特性 5  initializer_list<>

一包东西,但是类型得是相同的,实现C++源码的重要语法,知道怎么用就可以.传递过程不需要我们担心,编译器会自动处理

int main(int argc, const char * argv[]) {
    std::initializer_list<int> t1 {1,2,3,4};
    std::cout<<max(t1)<<std::endl;//新的max() 传参采用 initializer_list 不在受限于参数个数
    return 0;
}

输出结果



新特性 6   新for循环

新的for循环采用for(del声明 : coll容器),与旧for()不冲突

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v1 {1,2,3,4,5};
    for (auto i: v1) {
        std::cout<< i <<std::endl;
    }
    return 0;
}

输出结果



新特性 7  =default与=delete

class Zoo//delete删掉编译器给的 default要编译器给的即使定义了也要让编译器给出
{
public:
    Zoo(int i1,int i2) : d1(i1),d2(i2) {}
    Zoo(const Zoo&) = delete;//拷贝构造函数
    Zoo(Zoo&&) = default;//右值引用 Move()
    Zoo & operator = (const Zoo&) = default;
    Zoo operator = (const Zoo&&) = delete;
    virtual ~Zoo();

private:
    int d1,d2;
};

a.  =default用于普通函数无意义(构造函数可以共存)

b.  =delete用于普通函数可以取代于virtual function = 0

c.  BIG-Three 默认构造函数 默认拷贝构造函数 默认析够函数 他们三个函数的作用是给编译器防止一个幕后藏身的地方 如父类的构造函数调用过程.

    类中有指针成员,需要重写BIG-Three没有则不用

d.  类中讲拷贝构造与构造函数声明成private 如果你的类继承自noncopyable 那么你的类也不能被拷贝

简单实现一下noncopyable

class noncopyable
{
protected:
    noncopyable (void)  {}
    ~noncopyable (void)  {  }  

private:
    noncopyable (const noncopyable&);
    const noncopyable& operator= (const noncopyable&);
};


新特性 8  Alias Template(template typedef)

功能相当于取别名

template<typename T>
using vec = std::vector<T,std::allocator<T>>;
int main()
{
    vec<int> v1 {1,2,3,4};
    for(auto i: v1)
    {
        std::cout<< i <<std::endl;
    }
    return 0;
}



新特性 9  Type Alias

类似于typedef,重新命名

typedef void (*func) (int, int);
using func = void(*) (int,int);//这两个函数意义相同 但是感觉using更容易让人理解
template <typename T>
struct Container {
    using value_type = T; // 相同于 typedef T value_type;
};


新特性 10  noexcept,override,final关键字

//noexcept 保证函数不会丢出异常
void foo() noexcept; //== void foo() noexcept(true) 括号内处条件  在完成什么条件下不会抛出异常
void swap(string & x ,string & y) noexcept(noexcept(x.swap(y)))
{
    x.swap(y);
}

class MyString
{
private:
    char * _data;
    size_t _len;

public:
    //move constructor  move语法必须用noexcept 尤其在vecotr上 不然不让编译 (voctor 是按传进参数个数成长 很容易在申请内存上出错) move意义上当于 by reference
    MyString(MyString&& str)noexcept : _data(str._data), _len(str._len){}
    MyString& operator= (MyString&&str) noexcept {return *this;}

};
//override 运用在虚函数上 自动识别是否是虚函数
struct Base
{
    virtual void vfunc(float){}
};
struct Drivedl:Base
{
    virtual void vfunc(float) override {}//自动识别该函数是否是基类中的虚函数 如果不是报错
};
//final 继承树下的最后一个  (没有人可以在继承它)
struct Base1 final{};//1.作用于类,该类不可被继承
struct Base2
{
    virtual void f() final;//2.作用于函数 该虚函数不可以被重写
};


新特性 11  decltype

相当于type of (识别类型),然编译器去识别type,不能识别重载的函数

1.基本使用方法

int main() {
    auto num = 1;  //num 是int类型
    decltype(num) num2 = num; //num2 也是int类型
    return 0;
}

2..声明返回值类型

//判断两个参数相加的返回值类型
template<typename T1,typename T2>
auto add(T1 x, T2 y) -> decltype(x+y);

3. 做参数

class Person
{
public:
    Person(){};
    ~Person(){};

public:
    int m_age = 0;
    std::string lastname  = "";
    std::string firstname = "";

};

auto cmp = [](const Person& p1,const Person& p2)//lambda
{
    return p1.lastname<p2.lastname||
    (p1.lastname == p2.lastname && p1.firstname< p2.firstname);
};

int main()
{
    std::set<Person,decltype(cmp)> coll(cmp);
    Person * p1 = new Person;
    p1->lastname = "a";

    Person * p2 = new Person;
    p2->lastname = "b";

    Person * p3 = new Person;
    p3->lastname = "c";
    coll.insert(*p3);
    coll.insert(*p1);
    coll.insert(*p2);

    for (auto i: coll) {
        std::cout<<i.lastname<<std::endl;
    }

    return 0;
}

输出结果

参照<<侯捷 C++新标准 C++11>>

如有不对请指正.

时间: 2024-10-10 03:08:07

格式工厂(一)的相关文章

格式工厂 给视频添加背景音乐

打开格式工厂,然后打开高级,混流 添加文件,然后按确定 按开始,接着保存.

【格式工厂】将大视频文件压缩成一个比较的适合手机播放的文件

1.设置输出选项 1. 打开格式工厂,选择[移动设备] 2. 选择MP4 480p AVC格式,这里可以设置下音频流在保证音频正常的情况下可以降低下[采样率]和[比特率] 2. 选择文件输出即可 原文阅读:http://32eb657c.wiz03.com/share/s/0OWSlY0-UQTc2cv_fk3zqPhH2foGTa2AX4de2vkJWZ3RvAPe

格式工厂 v4.0.0 最新去广告绿色纯净版

最好用的多媒体格式转换利器:格式工厂现已更新至v4.0,此次更新加入最新的HEVC(H265)编码,MP4,MKV的压缩比大幅度提高!格式工厂,轻松转换一切你想要的格式!利器在手,转换不愁! 格式工厂是免费多功能的多媒体文件转换工具,最得力的转换帮手!它可以实现大多数视频.音频以及图像不同格式之间的相互转换.包括视频:MP4.AVI.3GP.WMV.MKV.VOB.MOV.FLV.SWF.GIF:音频:MP3.WMA.FLAC.AAC.MMF.AMR.M4A.M4R.OGG.MP2.WAV.Wa

“格式工厂”音频剪辑快速入门

导言:      这是第一次使用“格式工厂”这款软件.事出有因,这学期有一门课程要求我们小组进行PPT讨论.任务一出,为了使讨论的收效较好我们小组最后决定通过再剪辑一段视频进行补充展示.因此,之前都没有接触过前端的一些工具的我只好顶着头皮自己上网查阅“格式工厂”的使用说明(本来想让班上做前端的女同学帮忙剪辑一下视频的,但一方面碍于面子懒得求人,另一方面想想自己也是计算机专业出身的,这点小技能还是得自己掌握,说不定以后还要用).搜了2篇介绍之后,了解到音频剪切跟合并只不过是她的一个“副业”.其实,

格式工厂软件处理视频

最近做项目中,一个MP4的视频文件七百多兆,高清,做在网页中播放时画面不连续,卡顿. 用格式工厂处理后(格式工厂预设配置:AVC中质量和大小 )能在多个主流浏览器上流畅播放,压缩后只有原来3%的大小. 另外在调试时注意,当你把项目中视频换了以后,发现视频还是不能正确播放(其实播放的还是缓存中的错误转换的视频),然后我就清空浏览器的历史数据,发现还是不能正确播放,然后我就把项目中的视频文件删除后清空浏览器历史数据,发现还是不能正确播放(但是还能播放出缓存中错误转换视频的声音,视频出不来),说明浏览

格式工厂视频转换参数设置攻略

格式工厂是一个常用且好用的视频转换工具,但是怎么设置参数才能使转换后的视频更清晰且视频体积又不过于庞大呢?下面我们就来看看格式工厂输出设置更清晰视频的方法,需要的朋友可以参考下. 首先提供格式工厂视频转换软件的下载地址:http://www.pcfreetime.com/ 1.以转换MP4视频为例,首先得打开格式工厂软件. 2.点击"输出配置",进行视频转换参数的设置.分辨率是屏幕的大小,码率是比特率?帧率是每秒帧数目前符合我们标准的视频,都不会对源视频做压缩.以下几种情况会对视频做压

视频剪辑软件调研(格式工厂,爱剪辑,会声会影)

视频剪辑软件产品调研分析,互联网短视频快速放大了对视频剪辑软件产品的需求,视频剪辑软件产品一般比较复杂庞大,默认选择视频剪辑软件产品作为调研对象,如有感兴趣的其他软件产品也可以作为调研对象. 至少选用三款产品实际使用制作短视频,并总结列举他们的基本功能特点差异(表格对比基本功能特点) 他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的? 对比他们的售价 这些软件是如何到你手里的(邮购,下载,互相拷贝--) 这些软件有Bug 么?又是如何更新新版本的? 此类软件是什么时候开始出现的,同

格式工厂(七)Type Traits

版权声明:本文为博主原创文章,未经博主允许不得转载. 识别变量的type id,返回true或false,举一个简单使用的例子 template <typename T> void type_traits_output(const T& x) { cout << "\ntype traits for type : " << typeid(T).name() << endl; cout << "is_void\

格式工厂(六)shared_ptr

版权声明:本文为博主原创文章,未经博主允许不得转载. shared_ptr智能指针的一种,它的使用类似于auto_ptr. shared_ptr它有两个指针,一个指向引用计数,一个指向data.由于拥有引用计数,所有shared_ptr支持容器. shared_ptr的源码非常复杂这里也不做太多讲解,本文主要介绍一下shared_ptr的基本使用 间接使用 #include <iostream> using namespace std; class Person { public: Perso

格式工厂(四) 右值引用

版权声明:本文为博主原创文章,未经博主允许不得转载. 由于右值所产生的临时变量问题一直是一种诟病,C++11中引入了右值引用这个核心语言机制,来提升运行期性能. 首先我先说明一下什么是左值和右值: 左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存在的临时对象 int b = 20; //这里b是左值 20是右值 ,因为这个表达式过后 20将不存在了 而b依然存在 //同时也可以根据能否取地址来判断是否是左值(能取地址)还是右值(不能取地址),如