达人设计网官方网站,python做网站设计,wordpress连接到微博,wordpress 用户授权前言
后天考c#xff0c;但这几天得甲流了#xff0c;特别难受#xff01;复习c的时候复习着忘着#xff0c;所以用csdn记录一下不熟悉的知识点#xff0c;等后天考前再看一遍#xff01;
函数模板
#include iostream// 定义一个模板类
template class T1…前言
后天考c但这几天得甲流了特别难受复习c的时候复习着忘着所以用csdn记录一下不熟悉的知识点等后天考前再看一遍
函数模板
#include iostream// 定义一个模板类
template class T1, typename T2
class Pair {
private:T1 first;T2 second;public:// 构造函数Pair(T1 f, T2 s) : first(f), second(s) {}// 获取第一个元素T1 getFirst() const {return first;}// 获取第二个元素T2 getSecond() const {return second;}
};int main() {// 使用模板类 Pair其中 T1 为 intT2 为 doublePairint, double myPair(1, 3.14);// 输出结果std::cout First: myPair.getFirst() std::endl;std::cout Second: myPair.getSecond() std::endl;return 0;
}T类型参数实际上是一个虚拟的类型名 class 和typename的作用相同都表示“类型名”可互换
引用
格式 类型 引用变量名 原变量名
其中原变量名是定义好的变量
不能建立引用的引用也没有引用的指针 引用的用途主要是用来作函数的参数或函数的返回值
类和结构体类型的异同
用struct声明的类如果对其成员不作private或public的声明系统将其默认为public
而用class定义的类如果不作private或public声明系统将其成员默认为private在需要时也可以自己用显式声明改变
如果希望成员是公用的使用struct比较方便如果希望部分成员是私有的宜用class
建议尽量使用class来建立类写出完全体现C风格的程序
成员函数的存储方式
每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间而不包括函数代码所占用的存储空间
不同的对象使用的是同一个函数代码段它怎么能够分别对不同对象中的数据进行操作呢?
C为此专门设立了一个名为this的指针用来指向不同的对象
应当说明 常说的“某某对象的成员函数”是从逻辑的角度而言的而成员函数的存储方式是从物理的角度而言的二者是不矛盾的
构造函数
如果用户未定义构造函数系统会自动提供一个默认构造函数但函数体是空的不提供初始化作用
如果用户仅仅写了一个有参构造函数那么上述这个默认构造函数就会“消失”比如 构造函数也可以由默认值应该在声明构造函数时指定
声明构造函数时形参名可以省略Box(int 10,int 10,int 10)
构造函数带默认值时很容易和重载的构造函数产生歧义性比如
Box();
Box(int 10,int 10,int 10);
析构函数
析构函数不能被重载一个类可以有多个构造函数只能有一个析构函数
static局部对象只在main函数结束或调用exit函数结束程序时调用析构函数
全局对象则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时调用析构函数
对于静态局部对象只在程序第一次调用此函数建立对象时调用构造函数一次在调用结束时对象并不释放因此也不调用析构函数只在main函数结束或调用exit函数结束程序时才调用析构函数
常对象
定义常对象的形式为
类名 const 对象名[(实参表列)]; 或 const 类名 对象名[(实参表列)];
常对象必须要有初值所有成员的值都不能被修改。凡希望保证数据成员不被改变的对象可声明为常对象
如果一个对象被声明为常对象则不能调用该对象的非const型的成员函数(除了由系统自动调用的隐式的构造函数和析构函数)
引用常对象中的函数成员只需将该成员函数声明为const即可。如
void get_time( ) const; //将函数声明为const
t1.get_time( ); // 可行 修改常对象中的某个数据成员的值需要对该数据成员声明为mutable如 mutable int count;//可以用声明为const的成员函数来修改它的值
常数据成员 和一般常变量相似常数据成员的值是不能改变 只能通过构造函数的参数初始化表对常数据成员进行初始化。不能在构造函数中对常数据成员赋初值的方法。 Time∷Time(int h){hourh} //非法 Time∷Time(int h):hour(h){} //通过参数初始化表对常数据成员初始化 常对象的数据成员都是常数据成员因此常对象的构造函数只能用参数初始化表对常数据成员进行初始化
常成员函数 如果将成员函数声明为常成员函数则只能引用本类中的数据成员而不能修改它们例如只用于输出数据等 常成员函数可以引用const数据成员也可以引用非const的数据成员 const数据成员可以被const成员函数引用也可以被非const的成员函数引用
如果已定义了一个常对象只能调用其中的const成员函数而不能调用非const成员函数
常对象只保证其数据成员是常数据成员其值不被修改
常成员函数不能调用另一个非const成员函数
静态成员
如果想在同类的多个对象之间实现数据共享也不要用全局对象可以用静态的数据成员
静态数据成员不属于某一个对象在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员即使不定义对象也为静态数据成员分配空间它可以被引用 静态数据成员不随对象的建立而分配空间也不随对象的撤销而释放(一般数据成员是在对象建立时分配空间在对象撤销时释放)。静态数据成员是在程序编译时被分配空间的到程序结束时才释放空间
静态数据成员可以初始化但只能在类体外进行初始化。 一般形式为 数据类型类名∷静态数据成员名初值 int Box∷height10;
注意 不能用参数初始化表对静态数据成员初始化
如果未对静态数据成员赋初值编译系统会自动赋予初值0
静态成员函数没有this指针在C程序中静态成员函数主要用来访问静态数据成员而不访问非静态成员 在一个静态成员函数中 coutheightendl; //若height已声明为static则引用本类中的静态成员合法 coutwidthendl; //若width是非静态数据成员不合法 如果一定要引用本类的非静态成员应该加对象名和成员运算符“.”。如 couta.widthendl; //引用本类对象a中的非静态成员 假设a已定义为Box类对象且在当前作用域内有效则此语句合法
运算符重载
C不允许用户自己定义新的运算符只能对已有的运算符进行重载。 C中绝大部分的运算符允许重载。不能重载的运算符只有5个 . (成员访问运算符) * (成员指针访问运算符) ∷ (域运算符) sizeof (长度运算符) ?: (条件运算符) 重载不能改变运算符运算对象(即操作数)的个数。 重载不能改变运算符的优先级别。 重载不能改变运算符的结合性
重载运算符的函数不能有默认参数否则就改变了运算符参数的个数。 重载的运算符必须和用户定义类型的对象一起使用其参数至少应有一个是类对象(或类对象的引用)。参数不能全部是C的标准类型以防止用户修改用于标准类型数据的运算符的性质。 用于类对象的运算符一般必须重载但运算符“”和“”不必用户重载
自增运算符重载示例
#include iostreamclass Counter {
private:int count;public:Counter() : count(0) {}// 重载前置自增运算符 (var)Counter operator() {count;return *this; // 返回递增后的对象引用}// 重载后置自增运算符 (var)Counter operator(int) {Counter temp(*this); // 创建一个副本用于保存递增前的值count;return temp; // 返回递增前的对象副本}void display() const {std::cout Count: count std::endl;}
};int main() {Counter myCounter;// 使用前置自增运算符myCounter;myCounter.display();// 使用后置自增运算符Counter anotherCounter myCounter;myCounter.display();anotherCounter.display();return 0;
}
剩下的内容在下面三篇文章中写的比较详细
c 运算符重载
c 继承和派生
c 多态和虚函数