//区分不同库中相同名称的函数、类、变量等。本质上,命名空间就是定义了一个范围。 //std是一个命名空间,C++标准函数或者对象都是在std中定义的,例如cin和cout,当我们要使用标准库的函数或对象时都需要用std来限定。
<iostream> //该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。
6.1 字符串函数
//C++中用来操作以null结尾的字符串函数 strcpy(s1, s2);//复制字符串 s2 到字符串 s1。 strcat(s1, s2);//连接字符串 s2 到字符串 s1 的末尾。连接字符串也可以用 + 号 strlen(s1);//返回字符串 s1 的长度。 strcmp(s1, s2);//如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。 strchr(s1, ch);//返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 strstr(s1, s2);//返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
6.2 字符串类
#include <iostream> #include <string> using namespace std; int main () { string str1 = "runoob"; string str2 = "google"; string str3; int len ; // 复制 str1 到 str3 str3 = str1; cout << "str3 : " << str3 << endl; // 连接 str1 和 str2 str3 = str1 + str2; cout << "str1 + str2 : " << str3 << endl; // 连接后,str3 的总长度 len = str3.size(); cout << "str3.size() : " << len << endl; return 0; }
//定义结构 struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book; //访问结构成员 Books Book1; // 定义结构体类型 Books 的变量 Book1 strcpy( Book1.title, "C++ 教程"); // 输出 Book1 信息 cout << "第一本书标题 : " << Book1.title <<endl; //结构作为函数参数 printBook( Book1 );// 输出 Book1 信息 void printBook( struct Books book ) { cout << "书标题 : " << book.title <<endl; } //指向结构的指针 struct Books *struct_pointer; struct_pointer = &Book1;//在上述定义的指针变量中存储结构变量的地址。 struct_pointer->title;//指针访问结构的成员 // 该函数以结构指针作为参数 void printBook( struct Books *book ) { cout << "书标题 : " << book->title <<endl; } // 通过传 Book1 的地址来输出 Book1 信息 printBook( &Book1 ); //typedef 关键字 typedef struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }Books; Books Book1, Book2; //使用 typedef 关键字来定义非结构类型 typedef long int *pint32; pint32 x, y, z;//x, y 和 z 都是指向长整型 long int 的指针。
8.1 lambda表达式
//以lambda表达式为例 //Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。 //Lambda 表达式本质上与函数声明非常类似。 [](int x, int y){ return x < y ; } //[capture](parameters){body} // 与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定: [] // 沒有定义任何变量。使用未定义变量会引发错误。 [x, &y] // x以传值方式传入(默认),y以引用方式传入。 [&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。 [=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。 [&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。 [=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。 //另外有一点需要注意。对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入: [this]() { this->someFunc(); }();
8.2 引用VS指针
//主要区别: //不存在空引用。引用必须连接到一块合法的内存。 //一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 //引用必须在创建时被初始化。指针可以在任何时间被初始化。 //引用通常用于函数参数列表和函数返回值。 #include <iostream> using namespace std; // 函数声明 void swap(int& x, int& y); int main () { // 局部变量声明 int a = 100; int b = 200; cout << "交换前,a 的值:" << a << endl; cout << "交换前,b 的值:" << b << endl; /* 调用函数来交换值 */ swap(a, b); cout << "交换后,a 的值:" << a << endl; cout << "交换后,b 的值:" << b << endl; return 0; } // 函数定义 void swap(int& x, int& y) { int temp; temp = x; /* 保存地址 x 的值 */ x = y; /* 把 y 赋值给 x */ y = temp; /* 把 x 赋值给 y */ return; }
//当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边 #include <iostream> using namespace std; double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0}; double& setValues(int i) { double& ref = vals[i]; return ref; // 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i],最后再返回 shit。 } // 要调用上面定义函数的主函数 int main () { cout << "改变前的值" << endl; for ( int i = 0; i < 5; i++ ) { cout << "vals[" << i << "] = "; cout << vals[i] << endl; } setValues(1) = 20.23; // 改变第 2 个元素 setValues(3) = 70.8; // 改变第 4 个元素 cout << "改变后的值" << endl; for ( int i = 0; i < 5; i++ ) { cout << "vals[" << i << "] = "; cout << vals[i] << endl; } return 0; }
//向量容器(vector)与数组相似,不同的是,向量在扩展大小的时候,会自动处理它自己的存储需求 //常用函数 //push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。 //size( ) 函数显示向量的大小。 //begin( ) 函数返回一个指向向量开头的迭代器。 //end( ) 函数返回一个指向向量末尾的迭代器。 #include <iostream> #include <vector> using namespace std; int main() { // 创建一个向量存储 int vector<int> vec; int i; // 显示 vec 的原始大小 cout << "vector size = " << vec.size() << endl; // 推入 5 个值到向量中 for(i = 0; i < 5; i++){ vec.push_back(i); } // 显示 vec 扩展后的大小 cout << "extended vector size = " << vec.size() << endl; // 访问向量中的 5 个值 for(i = 0; i < 5; i++){ cout << "value of vec [" << i << "] = " << vec[i] << endl; } // 使用迭代器 iterator 访问值 vector<int>::iterator v = vec.begin(); while( v != vec.end()) { cout << "value of v = " << *v << endl; v++; } return 0; }
double pow(double, double);//x,y,返回x的y次方 double hypot(double, double);//a,b返回直角三角形第三斜边的长度c double sqrt(double);//该函数返回参数的平方根。 int abs(int);//该函数返回整数的绝对值。 double fabs(double);//该函数返回任意一个浮点数的绝对值。