14.2引用类型
1.引用(&)是标识符的别名
2.定义一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象
3.例如:
int i,j;
int &ri=i;//定义int引用ri,并初始化为变量i的引用
j=10;
ri=j;//相当于i=j
4.一旦一个引用被初始化后,就不能改为指向其他对象
5.引用可以作为形参
例:
//函数返回多个值,传引用//交换的引用传递
#include
using namespace std;
void swap(int& a, int& b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int x=5, y=10;
cout<< x << y << endl;
swap(x, y);
cout << x <
14.3含有可变参数的函数
1.如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型
15 内联函数
关键字:inline
内联函数体内不能有循环语句和switch语句
内联函数的定义必须出现在第一次被调用之前
对内联函数不能进行异常接口声明(第12章)
16 constexpr函数
17 带默认参数值的函数
有默认参数值的形参必须在形参列表的最右
18 c++系统函数
19 函数重载
8.10
类模板
4.1封装
封装的意义
1.将属性和行为为作为一个整体,表现生活中的事物
2.将属性和行为加以权限控制
封装的意义一:
在设计类的时候,属性和行为写在一起表现事物
语法:class 类名{ 访问权限:属性/行为};
封装的意义二
访问权限:
//公共权限:public,类内可访问,类外也可访问
//保护权限:protected
//私有权限:private
4.2对象的初始化和清理
4.2.1构造函数和析构函数
对象的初始化和清理:
1.一个对象或变量应进行初始化
2.使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题
C++使用构造函数和析构函数解决上述问题,这两个函数会被编译器自动调用,完成对象的初始化和清理工作。
· 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用
· 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作
构造函数语法 类名 ( ){ }
1.构造函数,没有返回值而且不用写void
2.函数名称和类名相同
3.函数在调用对象时会自动调用构造,无须手动调动,而且只调用一次
STL库
广义上分为容器、算法和迭代器
容器和算法通过迭代器无缝连接
*六大组件*:容器(vector,list,deque,set,map)、算法、迭代器、仿函数、适配器、空间配置器
容器
1.序列式容器:强调值的排序,每个元素都有固定的位置
2.关联式容器:二叉树结构,元素间没有固定的物理关系
算法
1.质变算法:运算过程中会更改区间内元素的内容,如插入,删除
2.非质变算法:不会更改
迭代器
提供一种方法可以有序访问容器中的各个元素同时无需暴露该容器内部的表达方式
每个容器都有自己专属的迭代器
类似于指针
vector
容器:vector
算法:for_each(遍历)
迭代器:vector::iterator
#include
#include
#include//算法头using namespace std;void myprint(int val){ cout<v; //push_back() 在Vector最后添加一个元素(参数为要插入的值) //插入数据 v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); //通过迭代器进行访问 //第一种遍历方式 for(vector::it=v.begin();it::iterator itBegin=v.begin();//起始迭代器,指向容器中的第一个元素 vector::iterator itEnd=v.end();//结束迭代器,指向容器最后一个元素的下一个位置 while(itBegin!=itEnd) { cout<<*itBegin<
#include
#include
using namespace std;class person{public: person(string name,int age) { mName=name; mAge=age; };public: string mName; int mAge;};int main(){ vectorv; person p1("aaa",10); person p2("bbb",20); person p3("ccc",30); person p4("ddd",40); person p5("eee",50); v.push_back(p1); v.push_back(p2); v.push_back(p3); v.push_back(p4); v.push_back(p5); for(vector::iterator it=v.begin();it!=v.end();it++) { cout<<"name is "<<(*it).mName<<"age is "<<(*it).mAge<
#include
#include
using namespace std;int main(){ int i; vector< vector > v; //创建小容器 vectorv1; vectorv2; vectorv3; vectorv4; //给小容器中添加数据 for(i=0;i<4;i++) { v1.push_back(i+1); v2.push_back(i+2); v3.push_back(i+3); v4.push_back(i+4); } //将小容器加入到大容器当中 v.push_back(v1); v.push_back(v2); v.push_back(v3); v.push_back(v4); //通过大容器将所有数据遍历一遍 for(vector< vector >::iterator it=v.begin();it!=v.end();it++) { //(*it)----容器vector
for(vector::iterator vit=(*it).begin();vit!=(*it).end();vit++) { cout<<(*vit)<<" "; } cout<
string容器
1.string本质上是一个类
2.string和 char*的区别①char*是一个指针②string是一个类,类内封装了char*,管理这个字符串,是一个char*型的容器
3.特点
string内封装了很多成员方法
*string构造函数:*
string();//创建一个空的字符串,例如:string strstring(const char*s);//使用字符串s初始化string(const string& str);//使用一个string对象初始化另一个string对象string(int n,char c);//使用n个字符c初始化
*string赋值操作*
1.string& operator=(const char*s);//char*类型字符串 赋值给当前字符串
2.string& operator=(const string &s);//把字符串s赋给当前的字符串
3.string& operator=(char c);//字符赋给当前的字符串
4.string& assign(const char*s);//把字符串s赋给当前的字符串
5.string& assign(const char*s,int n);//把字符串s的前n个字符赋给当前字符串
6.string& assign(const string &s);//把字符串s赋给当前字符串7.string& assign(int n,char c);//用n个字符c赋给当前字符串
1.string str1; str1="hello world";2.string str2; str2=str1;3.string str3; str3='a';4.string str4; str4=str.assign("hello world");5.string str5; str5=str.assign("hello world",5);//输出str5为hello6.string str6; str6=str.assign(str5);7.string str7; str7=str.assign(5,'w');//输出wwwww
*string拼接*
功能:实现在字符串末尾拼接字符串
函数原型:
1.string& operator+=(const char* str);//重载+=操作符2.string& operator+=(const char c);//重载+=操作符3.string& operator+=(const string& str);//重载+=操作符4.string& append(const char*s);//把字符串s连接到当前字符串的结尾5.string& append(const char*s,int n);//把字符串s的前n个字符连接到当前字符串结尾6.string& append(const string &s);//同operator+=(const string& str)7.string& append(const string &s,int pos,int n);//字符串s中从pos开始的n个字符连接到字符串末尾
1.string str1; str1="我"; str1+="爱玩游戏";//输出我爱玩游戏2.str1+=':';//输出我爱玩游戏:3.string str2="魔法觉醒"; str1+=str2;//输出我爱玩游戏:魔法觉醒4.string str3="I"; str3.append("love");5.str3.append("game abcde",4);//输出I love game6.str3.append(str2);//输出I love game 魔法觉醒7.str3.append(str2,0,2);//输出I love game 魔法
*string查找和替换*
功能:
查找:查找指定字符串是否存在
替换:在指定位置替换字符串
函数原型:
1.int find(const string& str,int pos=0)const;//查找str第一次出现位置,从pos开始查找2.int find(const char* s,int pos=0)const;//查找s第一次出现的位置,从pos开始查找3.int find(const char* s,int pos,int n)const;//从pos位置查找s的前n个字符的第一次位置4.int find(const char c,int pos=0);//查找字符c第一次出现位置5.int rfind(const string& str,int pos=npos)const;//查找str最后一次出现的位置,从pos开始查找6.int rfind(const char* s,int pos=npos)const;//查找s最后一次出现的位置,从pos开始查找7.int rfind(const char*s,int pos,int n);//从pos位置查找s的前n个字符的最后一次位置8.int rfind(const char c,int pos=0)const;//查找字符c最后一次出现位置9.string& replace(int pos,int n,const string& str);//替换从pos开始n个字符为字符串str10.string& replace(int pos,int n,const char*s);//替换从从pos开始n个字符为字符串s
1.查找 string str1="abcdef"; int pos=str1.find("de");//输出3,如果没有则输出-1 //rfind;从右往左查找;find;从左往右查找2.替换 string str1="abcdef"; str1.replace(1,3,"1111");//输出为a1111efg,即从1号字符起到三号字符全部替换成1111,即单纯的替换而不考虑长度
*string的比较*
= 返回0> 返回1< 返回-1
函数原型
1.int compare(const string &s) const; 2.int compare(const string *s) const;eg.str1.compare(str2);
string字符存取
函数原型
1.char& operator[](int n);//通过[]访问2.char& at(int n);//通过at访问
//eg1.通过[]访问单个字符str[i]2.通过atstr.at(i)
string插入和删除
1.字符串的插入 string str1="hello"; str1.insert(1,"1111");//输出h1111ello2.字符串的删除 str1.erase(1,3);//输出ho
*string子串*
string str="abcdef";string subStr=str.substr(1,3);//输出bcd
//eg,实用操作//从邮箱地址获取用户名string email="zhangsan@sina.com";int pos=email.find("@");string username=email.substr(0,pos);