本文介绍了C++11的新特性和安装环境,包括新语法特性、标准库以及智能指针的使用。文章还详细讲解了如何在Visual Studio和Code::Blocks中搭建C++11开发环境,并提供了基础语法入门和新特性的示例代码。通过这些内容,读者可以全面了解C++11学习的关键点和实践方法。C++11学习涉及从基础语法到高级特性的全面覆盖,帮助程序员提升编程技能。
C++11是C++编程语言的一个重要版本,该版本于2011年正式发布。相比之前的C++版本,C++11引入了许多新的功能和特性,使得编程更加简洁、安全和高效。
long long
、constexpr
和nullptr
。auto
关键字、range-based for
循环、lambda
表达式等。<chrono>
、<thread>
等新库,支持更强大的标准库函数。std::unique_ptr
和std::shared_ptr
,提高了内存管理的安全性。std::unordered_map
。这些特性增强了C++语言的功能性和安全性,使得编程更加灵活和高效。
Microsoft Visual Studio是C++编程一个常用的开发环境。以下是安装步骤:
下载Visual Studio:
访问Visual Studio下载页面,选择适合你的版本并下载安装。
安装C++开发套件:
启动Visual Studio安装程序,选择“自定义安装”。
点击“工作负载”,选择“使用C++的桌面开发”。
iso c++11 standard with gibec
。Code::Blocks是一个开源且免费的集成开发环境(IDE),适用于多种编程语言,包括C++。以下是安装步骤:
下载Code::Blocks:
访问Code::Blocks官网,下载最新版本。
安装Code::Blocks:
安装程序向导中,选择适合你的安装选项,点击“下一步”,直到安装完成。
#include <iostream> using namespace std; int main() { cout << "Hello, C++11!" << endl; return 0; }
Visual Studio:
main.cpp
文件中。Code::Blocks:
main.cpp
文件中。在C++中,变量用于存储数据,每种变量都有特定的数据类型。C++支持多种基本数据类型,包括整型、浮点型、字符型等。
整型数据类型用于存储整数,包括不同大小和符号的整数。
int
:通常是32位有符号整数。short
:通常为16位有符号整数。long
:通常是32位或64位有符号整数,具体取决于平台。long long
:64位有符号整数。int a = 10; short b = 5; long c = 100000L; long long d = 9223372036854775807LL;
浮点型数据类型用于存储小数。
float
:单精度浮点数(约7位有效数字)。double
:双精度浮点数(约15位有效数字)。long double
:扩展精度浮点数。float f = 3.14f; double d = 3.14159; long double ld = 3.14159265359L;
字符型数据类型用于存储单个字符。
char
:单个字符,通常是8位。wchar_t
:宽字符,通常用于多字节字符集。char ch = 'A'; wchar_t wc = L'B';
布尔型数据类型用于存储逻辑值,只有两种可能的值:true
和 false
。
bool flag = true;
#include <iostream> using namespace std; int main() { int a = 10; short b = 5; long c = 100000L; long long d = 9223372036854775807LL; float f = 3.14f; double d1 = 3.14159; long double ld = 3.14159265359L; char ch = 'A'; wchar_t wc = L'B'; bool flag = true; cout << "整型变量: " << a << ", " << b << ", " << c << ", " << d << endl; cout << "浮点型变量: " << f << ", " << d1 << ", " << ld << endl; cout << "字符型变量: " << ch << ", " << wc << endl; cout << "布尔型变量: " << flag << endl; return 0; }
在C++中,运算符用于执行各种操作,包括算术运算、逻辑运算、位运算等。
+
:加法-
:减法*
:乘法/
:除法%
:取模(取余)int a = 10; int b = 5; int sum = a + b; int difference = a - b; int product = a * b; int quotient = a / b; int remainder = a % b;
&&
:逻辑与||
:逻辑或!
:逻辑非bool flag1 = true; bool flag2 = false; bool logic_and = flag1 && flag2; bool logic_or = flag1 || flag2; bool logic_not = !flag1;
&
:按位与|
:按位或^
:按位异或~
:按位取反<<
:左移>>
:右移int a = 5; // 二进制:0101 int b = 3; // 二进制:0011 int bitwise_and = a & b; // 0001 int bitwise_or = a | b; // 0111 int bitwise_xor = a ^ b; // 0110 int bitwise_not = ~a; // -6 (二进制:1010) int bitwise_left_shift = a << 2; // 010100 int bitwise_right_shift = a >> 1; // 0010
#include <iostream> using namespace std; int main() { int a = 10; int b = 5; int sum = a + b; int difference = a - b; int product = a * b; int quotient = a / b; int remainder = a % b; cout << "加法结果: " << sum << endl; cout << "减法结果: " << difference << endl; cout << "乘法结果: " << product << endl; cout << "除法结果: " << quotient << endl; cout << "取模结果: " << remainder << endl; bool flag1 = true; bool flag2 = false; bool logic_and = flag1 && flag2; bool logic_or = flag1 || flag2; bool logic_not = !flag1; cout << "逻辑与: " << logic_and << endl; cout << "逻辑或: " << logic_or << endl; cout << "逻辑非: " << logic_not << endl; int bitwise_and = a & b; int bitwise_or = a | b; int bitwise_xor = a ^ b; int bitwise_not = ~a; int bitwise_left_shift = a << 2; int bitwise_right_shift = a >> 1; cout << "按位与: " << bitwise_and << endl; cout << "按位或: " << bitwise_or << endl; cout << "按位异或: " << bitwise_xor << endl; cout << "按位取反: " << bitwise_not << endl; cout << "左移: " << bitwise_left_shift << endl; cout << "右移: " << bitwise_right_shift << endl; return 0; }
C++中的控制结构包括if
、switch
、for
和while
等语句,用于控制程序的流程。
if
语句用于执行条件判断,基于条件的真假决定是否执行特定的代码块。
if (条件) { // 条件为真时执行的代码 } else { // 条件为假时执行的代码 }
示例代码
#include <iostream> using namespace std; int main() { int num = 10; if (num > 5) { cout << "num大于5" << endl; } else { cout << "num不大于5" << endl; } return 0; }
switch
语句用于执行多个可能的选择之一,基于不同的条件。
switch (表达式) { case 常量1: // 代码块1 break; case 常量2: // 代码块2 break; default: // 默认代码块 }
示例代码
#include <iostream> using namespace std; int main() { int num = 2; switch (num) { case 1: cout << "num是1" << endl; break; case 2: cout << "num是2" << endl; break; default: cout << "num是其他值" << endl; } return 0; }
for
循环用于重复执行一段代码,直到满足特定条件。
for (初始化; 条件; 更新) { // 循环体 }
示例代码
#include <iostream> using namespace std; int main() { for (int i = 1; i <= 5; ++i) { cout << "当前循环次数:" << i << endl; } return 0; }
while
循环用于重复执行一段代码,直到条件不再为真。
while (条件) { // 循环体 }
示例代码
#include <iostream> using namespace std; int main() { int i = 1; while (i <= 5) { cout << "当前循环次数:" << i << endl; ++i; } return 0; }
do-while
循环类似于while
循环,但首先执行循环体,然后检查条件。
do { // 循环体 } while (条件);
示例代码
#include <iostream> using namespace std; int main() { int i = 1; do { cout << "当前循环次数:" << i << endl; ++i; } while (i <= 5); return 0; }
#include <iostream> using namespace std; int main() { int num = 10; if (num > 5) { cout << "num大于5" << endl; } else { cout << "num不大于5" << endl; } int num2 = 2; switch (num2) { case 1: cout << "num2是1" << endl; break; case 2: cout << "num2是2" << endl; break; default: cout << "num2是其他值" << endl; } for (int i = 1; i <= 5; ++i) { cout << "for循环次数:" << i << endl; } int j = 1; while (j <= 5) { cout << "while循环次数:" << j << endl; ++j; } int k = 1; do { cout << "do-while循环次数:" << k << endl; ++k; } while (k <= 5); return 0; }
在C++中,函数用于封装可复用的代码块,可以通过函数名调用该代码块。
函数定义包括函数名、返回类型、参数列表和函数体。
返回类型 函数名(参数列表) { // 函数体 return 返回值; }
调用函数时,需要提供相应的参数,然后程序会执行函数体中的代码。
int result = 函数名(参数);
#include <iostream> using namespace std; // 函数定义 int add(int a, int b) { return a + b; } int main() { // 函数调用 int sum = add(3, 5); cout << "结果:" << sum << endl; return 0; }
函数可以返回一个值,返回值类型需要在函数定义中指定。返回值可以用于后续的计算或赋值。
int add(int a, int b) { return a + b; }
参数可以通过值传递或引用传递。值传递是将参数的副本传递给函数,而引用传递则是直接将参数传递给函数。
void increment(int& val) { ++val; } void increment_by_value(int val) { ++val; }
#include <iostream> using namespace std; // 通过值传递 void increment_by_value(int val) { ++val; } // 通过引用传递 void increment(int& val) { ++val; } int add(int a, int b) { return a + b; } int main() { int x = 5; int y = 5; // 通过值传递 increment_by_value(x); // 通过引用传递 increment(y); cout << "通过值传递:" << x << endl; cout << "通过引用传递:" << y << endl; int sum = add(3, 5); cout << "结果:" << sum << endl; return 0; }
指针是指向内存地址的变量,可以用来存储变量的地址。
int* ptr; ptr = &x; *ptr = 10;
引用是变量的别名,引用必须在声明时初始化。
int& ref = x; ref = 10;
#include <iostream> using namespace std; int main() { int x = 5; // 指针 int* ptr = &x; *ptr = 10; // 引用 int& ref = x; ref = 15; cout << "通过指针:" << x << endl; cout << "通过引用:" << x << endl; return 0; }
数组是一组相同类型的元素的集合,可以通过下标访问数组中的元素。
int arr[5] = {1, 2, 3, 4, 5};
int first = arr[0]; arr[0] = 10;
#include <iostream> using namespace std; int main() { int arr[5] = {1, 2, 3, 4, 5}; // 访问数组元素 cout << "第一个元素:" << arr[0] << endl; // 修改数组元素 arr[0] = 10; cout << "修改后的第一个元素:" << arr[0] << endl; return 0; }
字符串是一组字符的集合,可以用字符数组或std::string
类表示。
char str[10] = "Hello";
std::string
类std::string
是C++标准库提供的字符串类,提供了丰富的字符串操作方法。
#include <string> using namespace std; string str = "Hello";
#include <iostream> #include <string> using namespace std; int main() { char str1[10] = "Hello"; // 字符数组 cout << "字符数组:" << str1 << endl; // std::string string str2 = "Hello"; str2 += " World"; cout << "std::string:" << str2 << endl; return 0; }
string
类
std::string
类提供了多种方法来处理字符串,例如拼接、截取、查找等。
#include <string> std::string str = "Hello"; str += " World";
#include <string> std::string str = "Hello World"; std::string sub = str.substr(6, 5);
#include <string> std::string str = "Hello World"; size_t pos = str.find("World");
#include <iostream> #include <string> using namespace std; int main() { string str = "Hello"; // 拼接字符串 str += " World"; cout << "拼接后的字符串:" << str << endl; // 截取字符串 string sub = str.substr(6, 5); cout << "截取的字符串:" << sub << endl; // 查找字符串 size_t pos = str.find("World"); if (pos != string::npos) { cout << "找到World的位置:" << pos << endl; } else { cout << "未找到World" << endl; } return 0; }
结构体是一种复合数据类型,可以包含多个不同类型的数据成员。
struct Point { int x; int y; };
Point p; p.x = 10; p.y = 20;
#include <iostream> using namespace std; struct Point { int x; int y; }; int main() { Point p; p.x = 10; p.y = 20; cout << "坐标:(" << p.x << ", " << p.y << ")" << endl; return 0; }
类是一种用户自定义的数据类型,可以包含数据成员和成员函数。成员函数用于操作类的数据成员。
class Rectangle { int width; int height; public: void setDimensions(int w, int h); int area(); };
void Rectangle::setDimensions(int w, int h) { width = w; height = h; } int Rectangle::area() { return width * height; }
#include <iostream> using namespace std; class Rectangle { int width; int height; public: void setDimensions(int w, int h); int area(); }; void Rectangle::setDimensions(int w, int h) { width = w; height = h; } int Rectangle::area() { return width * height; } int main() { Rectangle rect; rect.setDimensions(10, 5); cout << "面积:" << rect.area() << endl; return 0; }
封装是将数据和操作数据的函数结合在一起,隐藏实现细节,对外提供统一的接口。
class Person { private: string name; public: void setName(string n); string getName(); }; void Person::setName(string n) { name = n; } string Person::getName() { return name; }
继承允许一个类继承另一个类的属性和方法,形成层次结构。
class Animal { public: virtual void makeSound() = 0; }; class Dog : public Animal { public: void makeSound() override { cout << "Woof!" << endl; } };
多态允许不同对象对同一消息作出不同的响应,通过继承和虚函数实现。
class Shape { public: virtual void draw() = 0; }; class Circle : public Shape { public: void draw() override { cout << "Drawing a circle." << endl; } }; class Square : public Shape { public: void draw() override { cout << "Drawing a square." << endl; } };
#include <iostream> using namespace std; class Animal { public: virtual void makeSound() = 0; }; class Dog : public Animal { public: void makeSound() override { cout << "Woof!" << endl; } }; int main() { Dog dog; dog.makeSound(); return 0; }
智能指针是一种可以自动管理内存的指针,主要类型包括std::unique_ptr
和std::shared_ptr
。
std::unique_ptr
std::unique_ptr
是独占所有权的智能指针,确保只有一个unique_ptr
可以持有给定的对象。
#include <memory> std::unique_ptr<int> ptr = std::make_unique<int>(10);
std::shared_ptr
std::shared_ptr
允许多个指针共享一个对象的所有权,当最后一个shared_ptr
销毁时,对象也会被销毁。
#include <memory> std::shared_ptr<int> ptr1 = std::make_shared<int>(10); std::shared_ptr<int> ptr2 = ptr1;
#include <iostream> #include <memory> using namespace std; int main() { // unique_ptr示例 std::unique_ptr<int> uniquePtr = std::make_unique<int>(10); cout << "unique_ptr的值:" << *uniquePtr << endl; // shared_ptr示例 std::shared_ptr<int> sharedPtr1 = std::make_shared<int>(10); std::shared_ptr<int> sharedPtr2 = sharedPtr1; cout << "shared_ptr1的值:" << *sharedPtr1 << endl; cout << "shared_ptr2的值:" << *sharedPtr2 << endl; return 0; }
auto
关键字可以自动推断变量的类型,简化了代码的编写。
auto var = 10; auto str = std::string("Hello");
#include <iostream> #include <string> using namespace std; int main() { auto var = 10; auto str = std::string("Hello"); cout << "变量类型:" << typeid(var).name() << endl; cout << "字符串:" << str << endl; return 0; }
范围基的for
循环可以方便地遍历容器中的元素。
for (int elem : vec) { // 处理elem }
#include <iostream> #include <vector> using namespace std; int main() { vector<int> vec = {1, 2, 3, 4, 5}; for (int elem : vec) { cout << "元素:" << elem << endl; } return 0; }
lambda表达式是一种匿名函数,可以方便地定义小型函数。
auto lambda = [](int a, int b) { return a + b; };
#include <iostream> using namespace std; int main() { auto lambda = [](int a, int b) { return a + b; }; cout << "结果:" << lambda(3, 5) << endl; return 0; }
总结:以上是C++11的基础知识、新特性和示例代码的详细介绍。希望这些内容可以帮助你更好地理解和使用C++11。如果你想进一步学习和实践,可以访问慕课网获得更多资源。