常函数
1.形式
回顾类中的函数成员:
class Cstu
{
public:
void print()
{
cout << "shlimy" << endl;
}
};
即在函数名后加const(类型限定符、类型修饰符) 就是常函数了
void print() const //常函数
{
cout << "shilmy" << endl;
}
2.注意
(1).构造函数和析构函数不可以是常函数
3.特点
(1).可以使用数据成员,但不能修改数据成员;对函数功能有更明确的限定
如:此时就不能修改a
class Cstu
{
public:
int a = 13;
void print() const //常函数
{
cout << "a" << endl;
}
};
(2).常对象只能调用常函数,不能调用普通函数
//续上
//主函数调用
const Cstu stu; //常对象,或叫只读对象 只能调用常函数
stu.print();
(3).常函数的this指针是const Cstu *
#include<iostream>
using namespace std;
class Cstu
{
public:
const Cstu* print() const //常函数 const Cstu*型
{
return this;
}
};
int main()
{
const Cstu stu; //常对象,或叫只读对象 只能调用常函数
const Cstu *p = stu.print(); //this是const Cstu*型
cout << p << endl;
system("pause");
return 0;
}
(4).常函数内部声明的变量允许进行修改 如下:
class Cstu
{
public:
int a = 13;
void print() const //常函数
{
int b = 2; //常函数内定义的可以修改,函外不可修改
b = a*b;
cout << b << endl;
}
};
静态成员使用方法static
静态数据成员
1.形式
静态成员:static int a;
static void westrong(){}
静态数据成员和函数成员的书写方式都是一样的
不能利用构造函数初始化,只能类外初始化(类内声明,类外定义)
class Cstu
{
public:
static int a;
Cstu() :a(2) //静态不能这样初始化
{
int a = 12; //赋值可以
}
};
//类外初始化
int Cstu::a = 13;
静态数据成员:
a.类外初始化,无static int Cstu::a = 13;
b.静态常量整形数据成员可以直接进行初始化
class Cstu
{
public:
static int a;
//静态(static) 整形(int char) 常量(const)
static const int b = 10; //在类中直接进行初始化
Cstu()
{
}
};
2.调用方式:
(1)通过类名作用域
class Cstu
{
public:
static int a;
Cstu()
{
}
};
int Cstu::a = 13; //初始化
//主函数调用
cout << Cstu::a << endl;
(2)通过对象调用
若类中又对a 赋值,则覆盖初始值
//同上的类
//主函数调用
Cstu stu;//通过对象调用
cout << stu.a << endl;
静态函数成员
1.注意
(1)属于类的属性,不是对象。即所有对象共有一个
如3.
(2)无this指针
(3)不能调用成员函数,可以调用静态成员
a.如下,int a;
只有调用的对象被创立后才会存在,而静态成员,对象存在前就已经存在了。所以不能使用数据成员或调用函数,只能使用静态的
class Cstu
{
public:
int a;
static void print()
{
cout << "静态函数成员" << endl;
}
Cstu()
{
}
};
(4)可以作为一种指挥该类所有对象的作用
像下面所说,静态是连接所有对象通信的工具
2.调用
Cstu::print(); //通过类名作用域调用
Cstu stu;
stu.print(); //通过对象调用
3.静态成员与数据成员及对象之间的联系
静态是类的一个属性,是公有的,每个对象都可以访问,在有对象前就存在了。而且其中一个对象修改静态,在其他对象中也会修改;数据成员是私有的,声明数据成员后,每个对象都单独有一份,在其中一个对象中修改,不会对其他对象的值产生影响。
不使用循环,变量自加1:
#include<iostream>
using namespace std;
class Cstu
{
public:
static int b; //声明一个静态b
Cstu()//能使b自加的构造函数
{
b++; //b是共享的,且每次调用都会自加
}
};
int Cstu::b = 0; //初始化b
int main()
{
Cstu stu[5];//创建对象数组 一共调用5次构造函数,b自加5次
cout << Cstu::b << endl; //输出b值
system("pause");
return 0;
}