2018-08-19 10:21:34 qq_38206090 阅读数 4784

DEV-C++默认的标准是C++98,改成C++11的方法如下:
Tools -> Compiler Options -> Setting -> Code Generation -> Language standard(-std),选ISO C++11。
DEC-C++改ISO C++11

2014-04-29 21:07:52 blood_flowing 阅读数 2818

0  C++11


C++11又称为C++0x是新的C++语言的标准,发布于2011年。新的标准取代了2003年发布的C++03,也为C++带来了些许改进。

1 关键词auto修订


一门语言如果太啰嗦了,不仅会为阅读带来障碍,而且还是许多错误的根源。所以从C语言继承而来的关键词auto在C++11中有了新的定义,可以进行自动类型推断。
例如:
//  C++03 方式
for (std::vector<int>::const_iterator ci = v.begin(); ci != v.end(); ++ci);

//  C++11 方式
for (auto ci = v.cbegin(); ci != v.cend(); ++ci);
// 注意 cbegin() 和 cend() 返回一个 const_iterator
需要谨慎的一些应用。
auto x = 10.0;
// 如果将 `10.0' 变换为 `10', x 将变为一个整型变量
// 此处可能会给依赖于它的重载函数带来困扰
// 因此,建议1:利用auto消除繁琐而不是用来保持一致性

for (auto i = 0ul; i < v.size(); ++i);
// 此处 auto i = 0ul 相当于 `unsigned long int i=0'
// 建议 2: 不要针对特定类型使用auto,因为那样做会给你带来不少问题

// 建议 3: 针对建议1和2,不要对常量使用auto


2  for()的循环范围


迭代操作在STL中是很常见的。C++11提供了一个专门的for函数来简化那些以begin()、end()为参数并返回迭代器的函数。这种新的方式对于C的数组同样有效。
例子:
// the C++03 way
for (std::vector<int>::iterator i = v.begin(); i != v.end(); ++i);

// the C++11 way
for (int &item: v);
// item 将从v的begin()执行到v的end()
// 注意这里的引用,它允许我们改变v中的内容

for (const int &item: v); // 这时不能改变内容,引用可以提速
for (int item: v); // 通过传值,不能改变v中内容

3 初始化列表


C++03中的容器不能像C中的数组那样利用列表初始化,这个问题在C++11中得到改进。
例如:
// C arrays
char   array1[] = {'A', 'B'};
double array2[] = {32.0, 6.003, -0.1};

// C++03 vectors

std::vector<char> cpp03vector1;
cpp03vector1.push_back('A');
cpp03vector1.push_back('B');

std::vector<double> cpp03vector2(3);
cpp03vector2[0] = 32.0;
cpp03vector2[1] = 6.003;
cpp03vector2[2] = -0.1;

// C++11 vectors
std::vector<char>   cpp11vector1 = {'A', 'B'};
std::vector<double> cpp11vector2 = {32.0, 6.003, -0.1};
// or...
std::vector<char>   cpp11vector3{'A', 'B'};
std::vector<double> cpp11vector4{32.0, 6.003, -0.1};
// 注意这种方式也适用于STL中的其他容器, 不仅仅是std::vector

列表初始化也可以运用在更复杂的结构中,如下所示:
#include <map>
#include <string>
#include <vector>
#include <utility>

using namespace std;

map<string, vector<pair<string, int>>> name_languages_year {
    {"Dennis Ritchie",    {{"B",      1969}, {"C",        1973}}},
    {"Niklaus Wirth",     {{"Pascal", 1970}, {"Modula-2", 1973}, {"Oberon", 1986}}},
    {"Bjarne Stroustrup", {{"C++",    1983}}},
    {"Walter Bright",     {{"D",      1999}}}
};
// 注意为了匹配template  列表的嵌套方式。

cout << name_languages_year["Niklaus Wirth"].at(0).first << endl; // prints `Pascal'

// adds a new entry to the map
name_languages_year["John McCarthy"] = {
    {"Lisp", 1958}
};
// 注意此处并没有显式的类型

4 C++数组


貌似这块儿是C++11添加的新的功能。
C++11提供了std::array,目的是来取代C中的数组。这是个尺寸可变的轻量级数组,使用的时候效果与std::vector差不多。
例子:
#include <array>

// C arrays
char  carray1[] = "Abc"; // caution, an unseen '\0' is added to the end
float carray2[] = {0.2f, 33.33f};

// C++ arrays
std::array<char, 3>  cpparray1{{'A', 'b', 'c'}};
std::array<float, 2> cpparray2{{0.2f, 33.33f}};
// 关注点 1: 尺寸在编译的时候推导
// 关注点 2:  数组尺寸不可变
// 关注点 3: 括号里的类型由参数列表决定


// 新旧数组的对比

std::cout << sizeof carray1 - 1; // -1 因为额外的 '\0'
std::cout << sizeof carray2 / sizeof (float); // 元素的个数 != 字节数
std::cout << cpparray1.size();
std::cout << cpparray2.size();

carray2[-5] = 0.1f; // 下溢
cpparray2.at(-5) = 0.1f; // throws std::out_of_range 异常

//  C++ arrays 比 C arrays好的原因有很多,从上述代码可见一斑

5 少许修正


C++03中的一些小缺陷在C++11中得到了修正。
例如:
 set<vector<int>>在C++11中可以编译了。(注意最后两个尖括号之间没有空间哦)
2  std::string 有了front和back成员函数。
3  文件流可以接受std::string类型的文件名,意味着我们不再需要使用可笑的c_str()进行转换。
4 可以很方便的将数值想std::string进行类型转换。通过以下重载函数:
   string to_string(int) 
   string to_string(float) 
   string to_string(double) 
   ...

6 支持C++11的编译器


1 GNU C++ 编译器需要加入 -std=c++0x 来编译 C++11 代码。
2 Visual Studio 2010部分支持C++11特性。
3 Visual Studio 201X(V11)仍然只对C ++11的功能部分支持。


2016-11-30 18:02:05 shiyanlou_chenshi 阅读数 26282

实验楼上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点。

  • 如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的!
  • 如果你不知道C++可以用来做哪些项目,可以应用在哪些地方,那么,这个项目列表拿去吧,可以看看C++可以做什么!

* C++项目列表:*

1、C++ 实现太阳系行星系统

项目使用 C++实现 OpenGL GLUT 实现一个简单的太阳系行星系统,将涉及一些三维图形技术的数学基础、OpenGL 里的三维坐标系、OpenGL 里的光照模型、GLUT 的键盘事件处理。

效果图

2、C++实现运动目标的追踪

这个项目是在前面一个项目的后续项目,利用 OpenCV 来实现对视频中动态物体的追踪。

3、C++ 实现银行排队服务模拟

项目使用 C++对银行排队服务进行模拟,以事件驱动为核心思想,手动实现模板链式队列、随机数产生器等内容,进而学习概率编程等知识。作为可选进阶,这个模型同时还能稍加修改的应用到 CPU 资源争夺模型中。

4、1小时入门增强现实技术

项目利用C++,基于OpenCV实现一个将3D模型显示在现实中的小例子,学习基于Marker的AR技术。

效果图

一个踩着魔鬼的步伐的漆黑的食人魔

5、100 行 C++ 代码实现线程池

项目使用 C++ 及大量 C++11新特性设计并实现一个线程池库。

6、C++实现第一人称射击游戏

项目使用C++和 OpenGL 实现一个第一人称射击类游戏,涉及键盘鼠标的处理、三维视角变换处理、素材加载渲染等。

7、C++三段代码机器绘图

用三段 140 字符以内的代码生成一张 1024×1024 的图片。

效果图

8、C++ 开发 Web 服务框架

服务器开发中 Web 服务是一个基本的代码单元,将服务端的请求和响应部分的逻辑抽象出来形成框架,能够做到最高级别的框架级代码复用。项目将综合使用 C++11 及 Boost 中的 Asio 实现 HTTP 和 HTTPS 的服务器框架。

9、C++ 打造 Markdown 解析器

Markdown 几乎成为了程序员编写文档的标配,Markdown 的相关语法简单,解析 Markdown 文本能够加深日后编写编译器中词法分析的理解,本项目将使用 C++ 实现 Markdown 解析器,并将解析的内容生成为 HTML。

效果图

10、C++ 实现高性能内存池

获得内存池所分配的内存速度高于从堆中获得分配的内存的速度,一个长期稳定运行的服务在追求极致的过程中,实现内存池是必不可少的。和标准库中的默认分配器一样,内存池本质上也是分配器,该项目将设计并使用 C++实现一个高性能内存池。

11、C++ 实现简易 Docker 容器

Docker 的本质是使用 LXC 实现类似虚拟机的功能,进而节省的硬件资源提供给用户更多的计算资源。本项目将 C++ 与 Linux 的 Namespace 及 Control Group 技术相结合,实现一个简易 Docker 容器。

12、C++ 实现内存泄露检查器

内存泄漏一直是 C++ 中比较令人头大的问题, 即便是很有经验的 C++程序员有时候也难免因为疏忽而写出导致内存泄漏的代码。除了基本的申请过的内存未释放外,还存在诸如异常分支导致的内存泄漏等等。本项目将使用 C++ 实现一个内存泄漏检查器。

效果图

13、C++ 使用 Crypto++ 库实现常用的加密算法

该项目利用 Cryto++库 对字符串进行 AES 加密和解密,RSA 加密和解密,生成 MD5 值。其中主要用到了 Crypto++ 库,这是开源的C++数据加密算法库,支持如下算法:RSA、MD5、DES、AES、SHA-256等等。

14、C++ 实现高性能 RTTI 库

RTTI 是运行时类型信息的英文缩写,C++ 本身提供了运行时类型检查的运算符 dynamic_cast 和 typeid,然而 dynamic_cast 的效率其实并不理想,需要牺牲一定性能。本项目将手动实现一个高性能 RTTI 库。

效果图

15、c++操作 redis 实现异步订阅和发布

该项目操作 redis 实现异步订阅和发布,其中将介绍 redis 基础知识,在linux中安装和使用 redis ,常用的 hiredis API,并实现一个例程。

以上都是可以用C++来实现的,所以,还在等什么?快去动手开发吧!

2017-12-10 19:21:41 syyyy712 阅读数 5063

C++矩阵转置

 看了很多网山有关矩阵转置的代码,大部分还用了中间变量,本人亲测矩阵转置代码无误,望对广大C++初学者有所帮助!

题目如下:
写一个函数,使给定的一个二维数组(3x3)转置,即行列互换。

Input

一个3×3的矩阵

Output

转置后的矩阵(每两个数字之间均有一个空格)

Sample Input

1 2 3
4 5 6
7 8 9
Sample Output

1 4 7
2 5 8
3 6 9

代码如下:

#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <array>
#include <algorithm>
using namespace std;
//int a[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
int a[3][3];
//int temp;
void main() {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cin >> a[i][j];
            cout << " ";
        }
        cout << endl;
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << a[j][i]<<" ";   
        }
        cout << endl;
    }
}
先定义一个int 类型的3x3的矩阵a,然后用cin输入,cout输出,输入的时候是按照a[i][j]输入,输出的时候两个for循环还是位置不变,只要将a[i][j]变成a[j][i]输出即可,包含这么多头文件是因为习惯性先把可能用到的头文件尽可能都写进去,同时在输出的for循环内部for循环结束时用了一个cout << endl ,确保最后以矩阵的形式输出。

运行结果:
这里写图片描述

2015-09-28 09:58:54 a2008301610258 阅读数 2946

c++ OOP的一些总结

1 面向对象特点:

封装,继承,多态

2 抽象类

抽象类是特殊的类,只是不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性;抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。虽然不能定义抽象类的实例,但是可以定义它的指针,这正是用抽象类实现接口的重点所在。

class animal  //抽象类(有了纯虚函数才能成为抽象类)
{
public:
      virtual ~animal() = 0; //纯虚析构函数
      animal (int i = 0){x = i} //构造函数可有可无
      virtual void count(float a) = 0;  //纯虚函数
protected:
int x;
}
//纯虚函数不能实例化,只有在子类中才能实例化


总结:如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,就不要定义虚析构函数了,因为它会增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移值性。

3 虚函数

C++实现运行中的多态性是通过虚函数实现的,而虚函数必须存在于继承环境下。
 虚函数是重载的一种表现形式,是一种动态的重载方式。
只有类的普通成员函数可以定义为虚函数,全局函数及静态成员函数(类拥有)不能声明为虚函数。


只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。所以虚函数只能用于类的继承层次结构中。


根据什么考虑是否把一个成员函数声明为虚函数?
       ① 看成员函数所在的类是否会作为基类
       ② 看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该将它声明为虚函数。

4 纯虚函数

 virtual 函数类型 函数名(形参表列)=0;

抽象类中定义的,为了派生类中的使用而声明定义的,其在基类中没有任何意义

5 虚析构函数 纯虚析构函数

如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数都自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。
virtual ~A(void);  //虚析构函数
virtual ~A(void) = 0;  //纯虚析构函数 ,所在的类就为抽象类了

如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,就不要定义虚析构函数了,因为它会增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移值性。

定义一个函数为虚函数,不代表该函数未被实现,只是为了来实现多态。

定义一个函数为纯虚函数,才表示函数未被实现 ,定义它是为了实现一个接口,起一个规范作用。继承抽象类的派生类要实现这个函数…


6 接口

时候,我们得提供一些接口给别人使用。接口的作用,就是提供一个与其他系统交互的方法。其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供给外部的接口来与你进行通信。根据c++的特点,我们可以采用纯虚函数的方式来实现。这样做的好处是能够实现封装和多态。
//提供给外面使用的接口一般采用纯虚函数
实现接口是通过继承接口的子类来实现的,不同的子类可以实现不同效果,即所谓多态。

7 抽象类与接口

抽象类和接口的区别:
      (1).类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中. 
      (2).接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;     
      (3).一个类一次可以实现若干个接口,但是只能扩展一个父类     
      (4).接口可以用于支持回调,而继承并不具备这个特点.     
      (5).抽象类不能被密封。   
      (6).抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的. 
      (7).(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。   
      (8).抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。   
      (9).好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。   
      (10).尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。   
      (11).如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.

8.封装

封装就是通过权限来限制类中的代码外界无法看到更无法更改;
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!
即 
1)公有( public )成员可以在类外访问。   
2)私有( private )成员只能被该类的成员函数访问。   
3)保护( protected )成员只能被该类的成员函数或派生类的成员函数访问。


 












C++学习大纲

阅读数 15777

C++实现简单二叉树

阅读数 3293

C++实现简单二叉树

博文 来自: qq_1844548689

C++项目经验总结

阅读数 4676

C++ __super

阅读数 8112

没有更多推荐了,返回首页