C++学习宝典(笔记)(8)

2019-07-13 16:41

如何修改类中,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);


C++学习宝典(笔记)(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:美学概论试题及答案1

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: