-
template 不是 typelate 千万注意! <T>是加在类的后面不是加在函数名后面!查看全部
-
定义一个类模板就相当于定义了一系列功能相同类型不同的类 定义类模板需要使用关键字template 模板参数既可以是类型,也可以是变量 定义类模板的参数可以使用typename和class,可以混用查看全部
-
定义类模板注意:在类的前面写上template<>,其中含有参数数列表;函数的定义写在内部不需要注意什么,写在外部就要注意,每一个函数在定义的时候都需要加上类前面写的template<>,写完之后还要在类的名字的后面加上<>中的参数,此时的参数不用写类型了查看全部
-
在类内定义成员函数,在类模板的情况下,并没有什么不同 在类外定义的时候,需要写上template<class T>,与在类的上方写的是一样的,每定义一个成员函数,都要加template<class T>(这里写的只是一种形式而已,并不是class T),同时需要在成员函数的类名后面用尖括号括起来,里面加上相应的参数 在使用的时候,实例化一个对象,需要在类名的后面用尖括号括起来当前这个对象当中是什么数据类型 既然定义的是模板类,所以每个成员函数的前面都要写template<class T>查看全部
-
/** * 定义模板函数swapNum * 实现功能:交换两个数的位置 */ template <typename T> void swapNum(T &a,T &b) // 调用模板函数 swapNum<int>(x,y);查看全部
-
函数模板的参数个数可以是一个也可以是多个 使用函数模板时,需要指定模板参数,此时的函数称为模板函数 当需要定义多个功能相同,数据类型不同的函数时,可以使用函数模板来定义 函数模板参数个数如果为0个,则没有必要使用函数模板查看全部
-
函数模版的使用,关键字template,可以使用typename以及class实现,或者混用实现,在实现模版函数前不存在重载关系,实现模版函数后才有重载关系 template <typename T> void display(T a) {cout<<a<<endl;} template<typename T,class S> void display(T t, S s) {cout<<t<<endl; cout<<s<<endl;} template <typename T, int KSize> void display(T t, int KSize) { for(int i=0;i<KSize;i++) {cout<<t<<endl;} } } display<int>(5); display<int, double>(1,1.5); display<int, 5>(6);查看全部
-
模板类型关键字:template typename class,typename和class 的作用是一样的 template <T class> T max(T a,T b){return (a>b)?a:b;} 参数T表明是一种类型, T max(T a,T b)是函数模板 int ival = max(100,90); 括号内都是int类型的,不指定的话,系统自动调用int类型 。此为模板函数 char cval = max<char>('A','B');指定数据类型,传入的类型一定要是指定的类型的参数,此为模板函数 只写函数模板,不写模板函数,系统是不会产生任何代码数据的 通过typename定义模板 template<typename T> void swap(T& a,T& b){} 变量作为模板的参数:template <int size> void display{cout <<size<<endl;} 使用是时候传入的就不是一个数据类型了,而是一个确定的值 display<10>(); 多参函数模板:template<typename T,typename C> void display(T a,T b){} 使用的时候两个参数的类型都要指定出来 int a = 1024;string str = "hello world"; display<int ,string>(a,str); 混用也可以:template <typename C, int size> void display(C a){} display<int , 5>(15); 要注意模板参数与函数的参数没有关系,不用去管它们查看全部
-
Map容器由于是键值对,因此需要规定 2 个参数,map<int ,String> m; map 是一对一对的,因此需要 pair(int,String)p(3,"Hello");map 没有 push_back()方法,插入方法是 m.insert(p);即在位置 3处存入String 的 “Hello”,可以通过 m[3] 访问到 Hello,运用迭代器访问键值对时,需要单独访问, itor->first(key), itor->second(value)查看全部
-
Coordinate &operator--()前置运算符重载 Coordinate operator--(int)后置运算符重载 Coordinate temp(0,0)记得附上初值查看全部
-
运算符重载可以使运算符具有新的功能 运算符重载使用关键字operator ++运算符重载需要区分前置++重载和后置++重载 有些运算符必须使用成员函数重载,有些则必须使用友元函数重载查看全部
-
友元函数可以直接调用私有数据成员,而不用通过get函数调用 friend ostream &operator <<(ostream &output,Coordinate&coor) 输出运算符必须写成友元函数的形式 friend ostream&operator<<(ostream&output,Coordinate&coor) { output<<coor3.getX<<","<<coor3.getY<<endl; return output }查看全部
-
<<运算符重载:friend ostream& operator<<(ostream &out,const Coordinate &coor); 实现函数时这样写:ostream& operator<<(ostream &out,const Coordinate &coor){out <<coor.m_iX<<","<<coor.m_iY; return out;} 输出运算符重载只能使用友元函数重载,不能使用成员函数重载,因为第一个是ostream,而成员函数第一个是this指针 operator是关键字,重载运算符的关键字 索引运算符不能采用友元函数重载,友元函数的第一个参数可以是成员函数重载中的this指针,也可以是其他的值,索引运算符的第一个参数必须是this指针,因为只有第一个参数是this指针才能够传入索引,索引才会是表达的当前的对象的当中的成员查看全部
-
后置++: Coordinate Coordinate::operator++(int) 前置++: Coordinate&Coordinate::operator++() 返回值类型为什么不同: 参数传入都是 this,执行过后this本身也全都自增,但唯一区别是后++语句调用处应该是原值,所以不能直接返回this ,而是返回对象(this最初的拷贝)查看全部
-
运算符重载的时候可以用this指针,也可以不用 定义的时候使用引用的好处:取了一次负号,可以再取负号,即为可以多次取用 友元函数的重载,后面的括号内,一定要填写东西,普通函数的重载可以不写 一元运算符重载 一.成员函数的负号运算符重载 1.声明部分:因为每次取反后返回的坐标(即对象)是它本身,所以此重载在类中要用引用去声明;//Coordinate& operator-(); 2.定义部分:就是对其坐标取负值赋给本身,返回this指针指向的值(默认指针参数this指向部分) Coordinate&Coordinate::operator-() { m_iX=-m_iX或this->m_iX=-(this->m_iX); m_iY=-m_iY或this->m_iX=-(this->m_iY); return *this; } 3.调用部分:实例化一个对象,对对象取反(其实是调用负号运算符重载),然后打印出来; 例:Coordinate coor(1,3); cout<<coor.getX()<<","<<coor.getY()<<endl;//打印出横纵坐标 -coor;//其实是调用运算符重载coor.operator-();//因为采用引用可以二次取反,负负得正 -(-coor); cout<<coor.getX()<<","<<coor.getY()<<endl;//打印出取反后的横纵坐标 4.无运算符重载时,不能对对象取反(因为计算机不能识别负号) 二.友元函数的负号运算符重载 1.声明部分:要用friend关键字,参数原本是默认参数this指向部分,此时也可实例化一个对象或引用//friend Coordinate& operator-(Coordinate &c); 2.定义部分:不用类的作用域标识符::(因为友元函数是独立于类外的),且此时this变成对象c; Coordinate&operator-(Coordinate& c) { c.m_iX=-c.m_iX; c.m_iY=-c.m_iY; return c; } 3.调用部分:同上查看全部
举报
0/150
提交
取消