类的一些笔记

本文深入探讨C++中类的作用域、可见性、构造顺序等核心概念,并解析友元函数、继承及虚函数的使用技巧,同时介绍了运算符重载、文件流操作等实用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 类的作用域:
类定义和响应的成员函数定义范围
该范围内,类成员函数对数据成员有无限制的访问权
可见性
类名语序与其他变量名或者函数名相同,当类名与程序中的其他百年量或者函数名相同时,可以通过下面的方法来正确访问。
1)
非类型名--变量名,常量名,函数名,对象名。枚举成员
如果一个非类型名隐藏了类型名,则类型名通过加前缀即可
class Sample   //定义类
{
//...
}

void func(int Sample )   //行参隐藏了类名
{
  class Sample a; //定义一个对象要用到class
  Sample++;  //行参的操作
  //....
}

2)如果一个类型名隐藏了一个非类型名,则用一般作用域规则
int s=0; //全局变量
void func()
{
 class s{ }; //定义了一个局部类/函数中定义的类/
 s a;
 ::s=3;
}
int g=s;
名空间,指某名字在其中必须唯一的作用域
非类型名不能重名,一个名字不能同时指两个以上类型
类型名和非类型名可以相同,但是使用时类型名要加上前缀

对象构造的顺序
1。局部和静态对象(指块作用域和文件作用域的对象), 以声明的顺序构造
2。静态对象只被构造一次
3。所有全局对象都在主函数main之前被构造
4。全局对象构造时无特殊顺序
5。成员以其在类中的生命的顺序构造
6。析构函数以与构造函数相反的顺序调用

友员函数,可以是另一个类的成员函数
friend void funct( );
friend void B::func( );
友员类,可以是另一个类
friend class A

继承
如果基类和子类的方法参数或者返回类型不一样,即使写virtual也不是虚函数
如果返回的是对自己的引用或者地址的话,作为虚函数对待
clase baseClass
{
  baseClass& fun()
  {
  return *this
  }
};
class deriveClass
{
  deriveClass& fun( )
  {
  return *this;
  }
};

一个程序员努力工作,写出比较巧妙的代码,以达到减少一些程序行的目的,是不值得的,这种巧妙常常回弄巧成拙。但是通过继承分解出多余部分,可以合理的减少编程的工作量
虚拟继承
构造顺序
被继承的顺序,就是在声明类后的:后的顺序
1。虚拟基类按他们被继承的顺序构造
2。非虚拟基类按他们被继承的顺序构造
3。成员对象按他们声明的顺序调用

运算符重载
5种运算符不能重载
 . :: .* .-> ?:
四种运算符必须为成员形式
= () [] ->
4。类自己的构造函数

c& operator ++()前增量
c  operator ++(int)后增量
参数int 只是为了区分,没有任何意义
标准流的设备名
iostream.h
cin keyboard stdin standart input
cout screen  stdout standart output
cerr screen   stderr standart wrond
clog printer  stdprn printer

全局变量 ostream cout(stdout) //take standard device as its default parameter

文件流
fstream.h
ofstream,ifstream,fstream
ofstream( char* pFileName, int mode=ios::out,int prot=filebuf::openprot)
mode 文件打开方式
ios::ate  如果文件存在,则内容增加在末尾
ios::in  具有输入能力
ios::out 具有输出能力
ios::trunc 如果文件存在,清除文件内容
ios::nocreate 如果文件不存在,返回错误,不要创建
ios::noreplace 如果文件存在,返回错误,不要替换
ios::binary 以二进制方式打开文件

prot文件保护模式
filebuf::openprot 兼容共享
filebuf::sh_none 独占
filebuf::sh_read 允许读
filebuf::sh_write 允许写

 

对于在不同类型上做不同运算而又用同样名字的情况,为重载。
匹配的顺序:
1。寻找严格的匹配
2。通过内部转换寻求一个匹配
3。通过用户定义的转换寻求一个匹配,如果能查出有唯一的一组转换,就使用那

个函数
重载的要求:
1。参数个数不同
2。参数类型不同
3。参数顺序不同
内部实现:
使用名字粉碎 name mangling的方法来改变函数名,以区分不同的同名函数,一系

列代码被附加到函数名上以指示参数类型以及他们出现的次序,例如v,ci,f,l,d,r

分别表示void ,char,int,float,long,double,long double
int f(char),int f(char,int,double) 分别表示为 int f_c,int f_cid

默认参数
目的:让编程更简单,让编译器做更多的检查错误工作
声明
默认参数在函数声明中提供,又有声明又有定义时,不允许在定义中默认参数
顺序规定“
从左到右匹配
默认参数可将一系列简单的重载函数合并起来
默认值的限定
可以是全局变量,全局常量,一个函数,但是不可以是局部变量,因为默认参数的

函数调用是在编译时确定的,而局部变量的位置与值在编译时无法确定


虚函数
1。类的成员函数才能声明为虚函数,这是因为虚函数仅适用于有继承关系的类对


2。静态成员函数不能是虚函数,因为静态成员函数不受限制于某个对象
3。内联函数不能是虚函数,因为内联函数是不能在与动中动态确定其位置的,即

使虚函数在类的内部定义,编译时,仍将其看成非内联的
4。构造函数不能是虚函数,因为构造时,对象还是未定型的空间,只有在构造完

成后,对象才能成为一个类的实例。
5。析构函数可以是虚函数,而且通常声明为虚函数,

纯虚函数是在基类中为子类保留的一个位置,以便子类用自己的实在函数爱重载它

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值