by test3413
内联
inline float converter(float dollars);
非常短的函数适合于内联,编译器有可能会忽略inline关键字。
const成员变量
值在程序的执行期间不会改变,必须初始化。
const int num=100;
this指针
编译器把调用成员函数的对象的地址赋给 this指针
new & delete
int *ptr;
ptr = new int;
delete ptr;
int *ptr;
ptr = new int[100];
delete [] ptr;
对象数组初始化
class_name object_array[length] = {
class_name(arg1,arg2,…argn);
class_name(arg1,arg2,…argn);
……
}
拷贝构造函数
在下列情况,会调用拷贝构造函数
1.将某个对象初始化为类的另一个对象时
2.将对象当作参数传递给函数时
3.函数返回对象时
X::X(const X &ptr)
赋值操作符重载
Var1 & operator = (const Var1 & s){}
类型转换_基本数据类型->用户自定义类型
通过目标类的构造函数实现
Distance(float m){ } Distance d1 = 1.25;
类型转换_用户自定义类型->用户自定义类型
可通过目标类的构造函数实现
LFeet::LFeet (LMetres dm) {}
类型转换_用户自定义类型->基本类型
通过源类的转换函数转换
自定义类型到自定义类型的转换
1.目标类的构造函数转换
2.源类的转换函数转换
预定义的流
在iostream.h中定义
cin 标准输入流,默认是键盘
cout 标准输出流,默认是屏幕
cerr 标准错误流(非缓冲),默认是屏幕
clog 标准错误流(缓冲),默认是屏幕
文件写操作示例
#include <fstream.h>
char *name = "QWERTY POIUYT";
ofstream fout ("TEST.TXT");
fout << "此行写入了 TEST.TXT 中\n";
fout.close();
文件读操作示例
#include <fstream.h>
ifstream fin ("TEST.TXT");
fin >> line ;
fin. close();
异常处理的实现
1.try块,也称为监视部分
2.throw表达式,指示异常的种类
3.catch处理程序,在发生异常时执行
异常处理示例
try {
if (age > 100 || age < 1) {
throw "年龄无效!";
}
catch (char *msg)
{
cout << "错误!"<< msg <<endl;
}
}
友元函数
可以置于类说明的私有或公有部分,拥有访问类的私有部分的权限。
必须在它要访问的类中进行声明(因而需要提供源码),违背了面向对象编程的原则。
操作符重载
return_type operator op(argument list);
二元操作符重载
1.作为成员函数,接受单参数,该参数是这个操作符右边的值。
2.作为友员函数,接收双参数。
操作符重载示例
String operator +(String s2) //操作符函数
{
String temp; //创建一个临时对象
strcpy(temp.s, s); //复制这个字符串
strcat(temp.s, s2.s); //追加参数字符串
return(temp); //返回临时对象
}
派生类构造函数显式调用基类构造函数
class Base{
protected:
int a;
public:
Base(int c){ a = c;} //单参数构造函数
};
class Derived : public Base{
public:
Derived(int c):
Base(c){} //单参数构造函数
};
派生类的函数会覆盖基类的同名函数
虚函数
虚函数绑定到与对象所属的类,而不是与指针所对应的类。
需要用指针或引用来操作。
如果一个基类的析构函数被说明为虚函数,则其派生类中的析构函数也是虚析构函数,可省略virtual 说明符。
虚函数示例
virtual void draw() //基类中的虚函数 { cout << "绘制基本形状\n"; }
纯虚函数
基类无法(或没有必要)提供虚函数的实现,不能创建含有纯虚函数的类的对象。
virtual void print() = 0;
抽象类
包含纯虚函数的类,只能用作基类,不能创建抽象类的对象。
抽象类提供接口而不暴露实现细节,在许多商业用途的库和应用程序框架中使用。
class 类名 { virtual 类型 函数名(参数表) = 0; };
虚析构函数
调用析构函数是为了释放由构造函数分配的内存空间。
如果基类的析构函数是非虚的,则不能用指向派生类的指针调用派生类的析构函数。
注意:构造函数不能是虚函数
#include <iostream.h>
class Alpha {
private: char* alpha_ptr;
public:
Alpha() //构造函数不能是虚函数
{ alpha_ptr = new char[5]; }
virtual ~Alpha() //虚析构函数
{
delete[] alpha_ptr;
cout << "Alpha的析构函数" << endl;
}
};
函数模板示例
template <class T> T max(T a, T b) { return a > b ? a : b; }
类模板示例
template<class T> class Array {
public:
int getlength() {return length;}
T & operator[](int i) {return array[i];}
Array(int l)
{ length = l; array = new T[length]; }
~Array() {delete [] array;}
private:
int length;
T *array;
};
自增运算符重载
前缀方式++i
成员函数:X X::operator++();
友元函数:X operator++(X&);
后缀方式i++
成员函数: X X::operator++(int);
友元函数: X operator++(X&,int);
下标运算符示例
char& Carray::operator[](int i) {
static char ch;
if(i<Length && i>=0)
return Buffer[i];
else { cout<<“\n Index out of range.”; return ch; }
}
虚基类
引进虚基类的目的是使公共基类在其派生类对象中只产生一个基类子对象。
虚基类说明格式如下: virtual <继承方式><基类名>
虚基类示例
class A {
public: void f();
private: int a;
};
class B: virtual public A {
protected: int b;
};
class C: virtual public A
{ protected: int c; };
class D: public B, public C {
public: int g();
private: int d;
};
float operator float(){} //转换函数是类型转换操作符的重载
Distance d1(4, 1.2f), d2(6, 6.72f);
float m = float(d1) ; //显式调用转换函数
m = d2; //隐式调用转换函数
float operator DistFeet(){}
DistMeters dm1 = 1.0, df1;
df1 = dm1; //隐式使用转换函数
df1 = DistFeet (dm1); //显式使用转换函数