如何修改类中,const类型的数据成员 原程序T* const p;
通过函数。可以把一个常量的const属性去掉,把一个常 量临时转 化成一个变量 const_cast<(T*)&>(p)=new T[len];//把p变成了原来类型的引用。 n=len;
临时对象:
Time(13,15,25);
如果临时对象Time(13)它的初始值只有一个时,可以看成是类型转换 临时对象,用过一次之后就释放
组合对象,一个对象里面的成员又是另一个对象,如一个电脑对象又的显示器,主机对象。 组合对象一定要有初始化列表,因为在建组合对象系统自动调用构造函数,会建 一个里面成员对象的拷贝构造函数,而成员对象如里面有没有默认的形参值。就会出错
用这三个函数,来代替C语言中的强制类型转换
const_cast<类型&>(常量)//可以将一个常量,转化成变量。 static_cast<类型>(数据)//首选这个
reinterpret_cast<类型>(数据)//明知不安全还要类型转换
作业1,写一个日期类,数据有年月日,函数有三参构造函数。无参输入函数,无参输出函数。无参下一天,下一月,下一年,三个函数, 比较大小。跟另一个日期比较大小(小于返回负,大于返回正,相等返回0)。
作业2,写一个分数,分子,分母。函数有两个参数的构造 。输入、输出,是否非零。跟另一个分数相加相减,相比较(分母为0无效)
作业3,写一个大数类,数据就是不超过30位的大十进制数,函数有字符串构造和整数构造,输入、输出、是否非零,跟另一个大数相加、相减、相比较。
作业4,C++字符串类,sizeof(string)==4,动态实现
自已写一个字符串类,数据是可以任意长度的一串字符,函数有构造函数(形参可以是C风格的字符串const char*,或者是整数int,还可以是两个形参分别表示字符及重符及其重得的次数char int。),
追加一个字符串,一个字符,一个整数或者多少字符,输入输出,有能力的可以再写一个替换函数,比如说字符串“everyone”
如果做替换 replace(\会得到evABCyone
A a(56);//调用带参构造后又调用析构
A* P=new A(带参);//带参就调用带参的构造,但不会调用析构函数
A* p=new A();等价于A*P=new;//带参就调用无参的构造,但不会调用析构函数
例求一段程序从调用到运行的时间,可以得到小于1秒的时间,因为用time(NULL)得到的时间最小是一秒。 #include
long start=clock(); long finish=clock();
(start-finish)/CLOCKS_PER_SEC
//在有const的函数中,可以改变加mutabla修饰的数据成员的属性 class Str{
char const* s; const char c; mutable int pos;//在有const的函数中,可以改变加mutabla修饰的数据成员的属性
*********************2010年09月19日 星期日 09时18分47秒 (第十一天)********************************** /*
拷贝构造:总是本类的引用。
默认的拷贝构造:默认把本类所有数据成员复制一份,而当数据成员是指针时,就须要自已修改,复制指针没有意义
拷贝构造作用:如当一个对象复制给令一个对象时用到 建对象:调拷贝构造函数
建形参对象:调拷贝构造函数。
如不允许使用拷贝构造函数,可把它写在私有属性中, */
操作符重载--------------凡是涉及到自定义类型时,编译器都会把运算符,换成运算符函数。
s2=s;//运算赋也是 个函数,等同于s2 operater=(s)//要重载赋值运算符。 如---重载输出
ostream& operator<<(ostream& os,const R& r) {
os<<\因为这个函数是在类上定义,所以不能访问私有成员 return os; }
重载后 在int main()中
可以cout< 如---重载输入(注意输入不能加const,因为就是要改变对象) istream& operator>>(istream& is,R& r) {//因为访问了私有成员所以在类中要有friend istream& operator>>(istream& is,R& r) is>>r.n>>r.d; return is; } 重载后 在int main()中 cin>>r; 友元:friend 函数的声明;-------------------------注意友元函数,不是成员 表明这个函数可以访问这个类中的所有成元,包括私有 如--重载+运算符 R operator+(const R& r)const { } 对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传 递”,目的是提高效率。例如将 void Func(A a) 改为 void Func(const A &a)。 对于内部数据类型的输入参数, 不要将“值传递”的方式改为 “const 引用传递” 。 否则既达不到提高效率的目的, 又降低了函数的可理解性。 例如 void Func(int x) 不 应该改为 void Func(const int &x)。 /* 在分数类中,重载前后++ --,及类型转换运算符 */ class R{ private: int n; int d; public: R(int n=0,int d=1):n(n),d(d){} friend ostream& operator<<(ostream& os,const R& r)// 重载输出,是友元不是成员函数 { os<<'['< R& operator++()//重载前++ { n+=d; return *this;//*this,表当前对角,不用*表当前对象的地址 } R operator++(int )//重载后++,int 总是0为区别前++,称为哑元 { R old(*this); n+=d;//对象已加1; return old;//以旧值做为结果,总是以旧值先初始化一个对象。 } R& operator--()//重载前-- { n-=d; return *this; } R operator--(int)//重载后-- { R old(*this); n-=d; return old; } operator double()const//重载类型转换运算符-----因为类型转换返回类型肯定是该类型,所以不用写 { return (double)n/d;//或者return 1.0*(n/d); } }; //R& operator++(R& r)//非成员形式的前++ //R operator++(R& r,int)//非成员形式的后++ int main() { R a(3,5),b(3,5); cout< cout<<\结果8/5 cout<<\结果: cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ cout<<\} static函数成员:表示这个成员是属于整个类,而不属于某个成员 定义时:static void release()//这个成员是属于这个类,而不属于某个成员 { //cout< delete a[i]; } 调用时:A::release() static数据成员:也是属于整个类 定义时:static int cnt;//静态数据成员只能初始化一次,不能每生成一个对象就初如化一次,所以要在类外初始化 初始化在类外如下int A::cnt=0 /* 重载new,delete,重载new[],delete[] */ class A{ int data; public : A(int n=0):data(n){cout< static void * operator new(size_t bytes)//size_t表字节型的数据。 { cout<<\申请\内存\ return (A*)malloc(bytes); } static void operator delete(void* p) { cout<<\释放\所指的空间\ free(p); } static void * operator new[](size_t bytes)//size_t表字节型的数据。 { cout<<\申请\内存\ return (A*)malloc(bytes); } static void operator delete[](void * p) { cout<<\释放\所指的空间\ free(p); } }; int main() { A* p=new A(10);