一。static
不同对象的成员变量相互独立,它们的值不受其他对象的影响。有时候我们希望在多个对象之间共享数据,对象a改变了某份数据后对象b可以检测到。
使用静态成员变量来实现多个对象共享数据的目标,被static修饰。
注意事项:
1.static成员变量必须在类声明的外部初始化
type class::name = value;type
是变量的类型,class 是类名,name 是变量名,value 是初始值。将上面的 m_total 初始化:
int Student::m_total = 0;
2.静态成员变量在初始化时候不能再加static,但必须要有数据类型
3.在没有类的外部初始化情况下static成员变量不能使用
static 成员变量既可以通过对象来访问,也可以通过类来访问。请看下面的例子:
//通过类类访问 static 成员变量 Student::m_total = 10;
//通过对象来访问 static 成员变量 Student stu("小明", 15, 92.5f); stu.m_total = 20;
//通过对象指针来访问 static 成员变量 Student *pstu = new Student("李华", 16, 96); pstu -> m_total = 20;
这三种方式是等效的。
参考代码:2.7_staitc成员变量.cpp
#include
<iostream>
using
namespace
std;
class
Student{
public
:
Student(
char
*name,
int
age,
float
score);
void
show();
private
:
static
int
m_total;
//静态成员变量
~Student(){ m_total --;}
char
*m_name;
int
m_age;
float
m_score;
};
//初始化静态成员变量
int
Student::m_total = 0;
Student::Student(
char
*name,
int
age,
float
score): m_name(name), m_age(age), m_score(score){
m_total++;
//操作静态成员变量
}
void
Student::show(){
cout<<m_name<<
"的年龄是"
<<m_age<<
",成绩是"
<<m_score<<
"(当前共有"
<<m_total<<
"名学生)"
<<endl;
}
int
main(){
//创建匿名对象
(
new
Student(
"小明"
, 15, 90)) -> show();
(
new
Student(
"李磊"
, 16, 80)) -> show();
(
new
Student(
"张华"
, 16, 99)) -> show();
(
new
Student(
"王康"
, 14, 60)) -> show();
return
0;
}
static静态成员函数
在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
参考代码:2.8_staitc成员函数.cpp
#include
<iostream>
using
namespace
std;
class
Student{
public
:
Student(
char
*name,
int
age,
float
score);
void
show();
public
:
//声明静态成员函数
static
int
getTotal();
static
float
getPoints();
private
:
static
int
m_total;
//总人数
static
float
m_points;
//总成绩
private
:
char
*m_name;
int
m_age;
float
m_score;
};
int
Student::m_total = 0;
float
Student::m_points = 0.0;
Student::Student(
char
*name,
int
age,
float
score): m_name(name), m_age(age), m_score(score){
m_total++;
m_points += score;
}
void
Student::show(){
cout<<m_name<<
"的年龄是"
<<m_age<<
",成绩是"
<<m_score<<endl;
}
//定义静态成员函数
int
Student::getTotal(){
return
m_total;
}
float
Student::getPoints(){
return
m_points;
}
int
main(){
(
new
Student(
"小明"
, 15, 90.6)) -> show();
(
new
Student(
"李磊"
, 16, 80.5)) -> show();
(
new
Student(
"张华"
, 16, 99.0)) -> show();
(
new
Student(
"王康"
, 14, 60.8)) -> show();
int
total = Student::getTotal();
float
points = Student::getPoints();
cout<<
"当前共有"
<<total<<
"名学生,总成绩是"
<<points<<
",平均分是"
<<points/total<<endl;
system(
"pause"
);
return
0;
}
二。this
this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。
this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。 this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。
三。const:
const对象只能访问const成员函数
2.
const代码示例
#include
<iostream>
using
namespace
std;
class
Student{
public
:
Student(
char
*name,
int
age,
float
score);
public
:
void
show();
char
*getname()
const
;
int
getage()
const
;
float
getscore()
const
;
private
:
char
*m_name;
int
m_age;
float
m_score;
};
Student::Student(
char
*name,
int
age,
float
score): m_name(name), m_age(age), m_score(score){ }
void
Student::show(){
cout<<m_name<<
"的年龄是"
<<m_age<<
",成绩是"
<<m_score<<endl;
}
char
* Student::getname()
const
{
return
m_name;
}
int
Student::getage()
const
{
return
m_age;
}
float
Student::getscore()
const
{
return
m_score;
}
int
main(){
const
Student stu(
"小明"
, 15, 90.6);
//stu.show(); //error
cout<<stu.getname()<<
"的年龄是"
<<stu.getage()<<
",成绩是"
<<stu.getscore()<<endl;
const
Student *pstu =
new
Student(
"李磊"
, 16, 80.5);
//pstu -> show(); //error
cout<<pstu->getname()<<
"的年龄是"
<<pstu->getage()<<
",成绩是"
<<pstu->getscore()<<endl;
return
0;
}
四。友元函数和友元类(friend)
友元函数不是成员函数
友元函数 在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。 友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的