C++:类与类中的函数
C++特性的C实现
C++ 在 C with class 时期,C++ 的实现是先将 C++ 程序翻译为 C 程序,然后使用 C 编译器进行编译
从其中我们可以窥见一些细节
甚至可以用 C 提供的基本特性来实现面向对象特性 例子
this 指针
this 指针就是下面 C 函数中的指针 C,即 this 指针指向的就是调用该成员函数的对象
this 是一个指针常量 (const of pointer),类型声明为 class * const this
然而 对于以下代码
class type{
void print(){ std::cout << "hello world"; }
};
type *t = NULL;
t->print();
仍然可以正确执行,因为在该成员函数中,并没有实际访问 this 指针指向的对象
静态成员
静态成员变量
使用 static
修饰的成员变量为静态成员变量,该变量属于类而非某个具体对象
sizeof
运算符计算对象大小时,不会包括静态成员变量
静态成员变量实际上就是类空间内可见的全局变量
类中的静态成员变量只能通过声明为全局变量来初始化
静态成员函数
使用 static
关键字修饰成员函数,表明该成员函数是属于类的,并不作用与某个对象
因此静态成员函数中没有 this 指针,也不可访问非静态成员
静态函数实际上就是类空间内可见的全局函数
设置静态成员函数的目的是将一些相关性强的全局函数收纳到一个类中
class Car {
public:
static int sv = 0;
static int getStaticVar(){ return sv; }
};
//三种访问静态成员函数的方式
Car c;
c.getPrice();
((Car *)NULL)->getPrice(); Java中 ((ClassName)null).classStaticMethod(); 与此类似
Car::getStaticVar();
类的所有对象共享类的静态成员
常量成员
常量成员变量
const
修饰的成员变量为常量
常量成员函数
在函数声明/定义语句的参数列表后使用 const
修饰符,表明成员函数为常量成员函数
在函数名前添加的 const 修饰的是返回值类型
常量成员函数中的 this 指向的对象是常量,即 this 的类型为 const class * const this
为保证安全,类的常量对象只可以调用常量成员函数,因为普通成员函数中可能对对象进行修改
而非常量对象也可以调用常量成员函数,因为由 指针常量 到 指向常量的指针常量 一定是安全的
常量成员函数与同名参数表也相同的非 const 成员函数以重载关系共存
此外,当成员变量使用 mutable
关键字修饰时,在常量成员函数中,就仍然可以改变
可以想到,mutable
关键字和 const
是冲突的,不可同时修饰一个变量
友元
友元分为 友元函数 和 友元类 两种
友元函数
在函数的声明语句前加上 friend
关键字,表明该函数为友元函数
可以将一个类的成员函数声明为友元,包括构造函数、析构函数
友元函数可以访问这个类的私有成员
当一个函数与某个类关系密切时,可以使用友元函数
class Saleman{
modifyPrice(Item * itp, int newPrice){ itp->price = newPrice; }
};
class Item{
private:
int price;
friend Saleman::modifyPrice(Item *itp, int newPrice);//声明为友元函数
friend getMostExpensive(Item[] its, int size);//声明为友元函数
};
int getMostExpensive(Item[] its, int size){
int p = 0, index = 0;
for(int i = 0;i<size;i++){
if(its[i].price > p){
p = its[i].price;
index = i;
}
}
return index;
}
友元类
如果 class B 是 class A 的友元,则 class B 的成员函数可以访问 class A 的私有成员
class B{};
class A{
friend class B;
};
友元关系不是双向的
友元类间的关系不传递,不进行继承
2020/1/19