C++语言基础 this和static关键字
一.this关键字
this是一个指针,可用其访问成员变量或成员函数
下面是使用this的一个完整示例:
#includeusingnamespacestd; classStudent{ public: voidsetname(char*name); voidsetage(intage); voidsetscore(floatscore); voidshow(); private: char*name; intage; floatscore; }; voidStudent::setname(char*name){ this->name=name; } voidStudent::setage(intage){ this->age=age; } voidStudent::setscore(floatscore){ this->score=score; } voidStudent::show(){ cout< name<<"的年龄是"< age<<",成绩是"< score< setname("李华"); pstu->setage(16); pstu->setscore(96.5); pstu->show(); return0; }
运行结果:
李华的年龄是16,成绩是96.5
this只能用在类的内部,通过this可以访问类的所有成员,包括private、protected、public属性的。
本例中成员函数的参数和成员变量重名,只能通过this区分。以成员函数setname(char*name)为例,它的形参是name,和成员变量name重名,如果写作name=name;这样的语句,就是给形参name赋值,而不是给成员变量name赋值。而写作this->name=name;后,=左边的name就是成员变量,右边的name就是形参,一目了然。
二.static关键字
2.1static静态成员变量
类似于java,C++中也有static静态成员变量,用法如下:
#includeusingnamespacestd; classStudent{ public: Student(char*name,intage,floatscore); voidshow(); public: staticintm_total;//静态成员变量 private: char*m_name; intm_age; floatm_score; }; intStudent::m_total=0;//初始化静态成员变量时不需要加static Student::Student(char*name,intage,floatscore){ } voidStudent::show(){ } intmain() { Student::m_total=10;//可以直接由类名访问 //栈区 Studentstu("Jack",15,92.5f); stu.m_total=20;//也可以直接由对象名访问 //堆区 Student*pstu=newStudent("Tom",16,96); pstu->m_total=20;//也可以直接由对象名访问 deletepstu; return0; }
注意:
1)一个类中可以有一个或多个静态成员变量,所有的对象都共享这些静态成员变量,都可以引用它。
2)static成员变量和普通static变量一样,都在内存分区中的全局数据区分配内存,到程序结束时才释放。这就意味着,static成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
3)静态成员变量必须初始化,而且只能在类体外进行。例如:
intStudent::m_total=0;//初始化静态成员变量时不需要加static
初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为0。全局数据区的变量都有默认的初始值0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。
4)静态成员变量既可以通过对象名访问,也可以通过类名访问,但要遵循private、protected和public关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存。
2.2static静态成员函数
下面演示static静态成员函数的用法:
#includeusingnamespacestd; classStudent{ public: Student(char*name,intage,floatscore); voidshow(); public://声明静态成员函数 staticintgetTotal(); staticfloatgetPoints(); private: staticintm_total;//总人数 staticfloatm_points;//总成绩 private: char*m_name; intm_age; floatm_score; }; intStudent::m_total=0; floatStudent::m_points=0.0; Student::Student(char*name,intage,floatscore):m_name(name),m_age(age),m_score(score){ m_total++; m_points+=score; } voidStudent::show(){ cout< show(); (newStudent("李磊",16,80.5))->show(); (newStudent("张华",16,99.0))->show(); (newStudent("王康",14,60.8))->show(); inttotal=Student::getTotal(); floatpoints=Student::getPoints(); cout<<"当前共有"< 注意:
1)静态成员函数与普通成员函数的根本区别在于:普通成员函数有this指针,可以访问类中的任意成员;而静态成员函数没有this指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
2)上例中的getTotal()、getPoints()也可以声明为普通成员函数,但是它们都只对静态成员进行操作,加上static语义更加明确。
3)和静态成员变量类似,静态成员函数在声明时要加static,在定义时不能加static。静态成员函数可以通过类来调用(一般都是这样做),但也可以通过对象来调用。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。