类中的特殊成员
c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态成员函数。
一:常数据成员与常成员函数
1.1常数据成员
const 修饰符;
若类中某些数据成员的值允许改变,而某些数据的值不想被改变,则用const修饰为常数据成员
常数据成员必须进行初始化而且不能更新,并且常数据成员只能通过初始化列表进行初始化,不能在构造函数内部进行赋值。
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(double newx,double newy);
void disp();
private:
double x;
//常数据成员
const double y;
};
//初始化列表对常数据成员进行初始化
Person::Person(double newx,double newy):y(newy)
{
x=newx;
}
void Person::disp()
{
cout<<"坐标为:("<<x<<","<<y<<")";
}
void test01()
{
Person p(2,1);
p.disp();
}
int main() {
test01();
system("pause");
return 0;
}
当常数据成员又是静态数据成员时,即为静态常数据成员时,其遵循静态成员的特点,需要在类外进行初始化。
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(double newx);
void disp();
private:
double x;
static const double y;
};
const double Person::y=1.0;
Person::Person(double newx)
{
x=newx;
}
void Person::disp()
{
cout<<"坐标为:("<<x<<","<<y<<")";
}
void test01()
{
Person p(2.0);
p.disp();
}
int main() {
test01();
system("pause");
return 0;
}
1.2常成员函数:
常成员函数使得对数据的访问仅限于读取,从而保护了数据,使之不被修改。在只需要获取数据的场合,通常使用常成员函数实现。
一:对常数据成员的访问通常使用常成员函数完成。
二:const关键字常出现在形参列表之后,在这里const关键字是函数的组成部分。
三:常成员函数可访问类中的const数据成员和非const数据成员,但不可以改变他们。
四:常成员函数不可调用非const成员函数。
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(double newx,double newy);
void disp()const;
private:
double x;
double y;
};
Person::Person(double newx,double newy)
{
x=newx;
y=newy;
}
void Person::disp() const
{
cout<<"坐标为:("<<x<<","<<y<<")";
}
void test01()
{
const Person p(2.0,1.0);
p.disp();
}
int main() {
test01();
system("pause");
return 0;
}
常对象只能调用常成员函数,可以这么说,常成员函数是为常对象专门准备的。
二:友元函数与友元类
在类的封装和共享之间打开一个缺口
友元函数的用法:
friend 函数声明
使用友元函数注意点:
c++不允许将构造函数,析构函数和虚函数声明为友元函数。
友元函数的声明可以放在类声明中的任意位置,不受访问权限的控制。
一个类的成员函数为另一个类的友元函数
friend 类名::函数
友元类的用法:
friend class 友元类名,友元是单向的。可以放在类声明中的任意位置。在硬件性能发展如此迅速的今天,友元贡献的程序效率越来越微不足道,所以在使用友元的时候,要权衡利弊。
三:静态数据成员与静态成员函数
c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态成员函数。
构成对象的只有数据。
静态数据成员-静态成员函数
class A{
public:
static int count
static int wanghao(){
return count=+;
}
};
类外初始化:
A::count=3;
(一)静态数据成员被提取出来放在程序的静态数据区内,为该类所有的共享,只有一份;
(二)静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数只存在一份代码实体
静态成员函数与其他函数的区别在于静态成员函数只能访问静态数据成员变量,可以在类内声明也可在类外定义,类外定义不必写staitic。
静态数据成员与静态成员函数只与类相关,不与类的对象相联系,所以访问方式如下;
类名::静态数据成员(静态成员函数)
[参考文档]:
《C++面向对象程序设计》西安电子科技大学出版社,李兰,张艳,任凤华
黑马程序员上课笔记