关于c++类的一些知识的总结
2019-03-06 07:14:56来源:博客园 阅读 ()
1、经常会听到“类的声明、类的定义、类的实现”,它们之间有什么不一样?
经过查阅https://www.cnblogs.com/kkshaq/p/4660073.html博客的说法,类的声明是在.h文件中完成的,也就是声明一个类但是没有具体写出它的实现。
而类的定义和类的实现其实是同一个东西,在.cpp文件中完成,写出类的函数的具体实现。
2、类的public成员、protected成员、private成员有什么区别?
如果没有派生类这种操作,那么protected成员和private成员是一样的,都只能被类的成员函数所访问,而不能被类的实例变量所访问。
类的实例变量只能访问类的public成员。
再说一些别的,类的成员彼此之间可以自由地互相访问,没有任何限制。也就是说protected成员可以访问private成员,private成员也可以自由地任意访问……
只有类的实例变量,限制多一点,只能访问类的public成员。
如果有了派生类,那么子类继承父类的方法有三种,public继承、protected继承、private继承。
如果是public继承,那么可以看成子类把父类的public成员放到了子类的public区域,把父类的protected成员放到了子类的protected区域,所以子类的成员可以访问父类的public成员和protected成员,以及子类自己的public、protected、private成员。父类的private成员无论如何都不能直接访问。
子类的实例变量,同样限制多一点,只能访问父类的public成员和子类的public成员,不能访问父类的protected成员、子类的protected、private成员。父类的private成员无论如何都不能直接访问。
如果是protected继承,那么可以看成子类把父类的public成员变成了子类自己的protected成员,放到了子类的protected区域,也把父类的protected成员放到子类的protected区域,所以子类的成员可以访问父类的public成员和protected成员,以及子类自己的public、protected、private成员。父类的private成员无论如何都不能直接访问。
子类的实例变量,只能访问子类的public成员,无法访问父类的任何成员和子类的protected、private成员。父类的private成员无论如何都不能直接访问。
如果是private继承,那么可以看成子类把父类的public成员和protected成员变成了子类自己的private成员,都放到了子类的private区域,所以子类的成员可以访问父类的public成员和protected成员,以及子类自己的public、protected、private成员。父类的private成员无论如何都不能直接访问。
子类的实例变量,只能访问子类的public成员,无法访问父类的任何成员和子类的protected、private成员。父类的private成员无论如何都不能直接访问。
所以在有派生出来的子类的时候,父类中的protected成员与private成员很大的一点区别是,父类的private成员永远不能被子类的成员和子类的实例变量所访问,而父类的protected成员可以被子类的成员所访问。
同样感谢https://www.cnblogs.com/langzou/p/9855582.html的分享。
3、友元函数和友元类
在博客https://www.cnblogs.com/staring-hxs/p/3432161.html中获取了一些知识,用自己的语言组织如下。
友元函数不是类的成员函数,但是却可以访问类的protected成员和private成员,只需要在类中加以特殊声明。友元函数的定义在类外实现。
声明格式是fiend 函数返回的类型 函数名(参数类型 参数名称),声明可以在类中的任意部分。
友元类,友元类中的每一个函数都是另一个类的友元函数,都可以访问另一个类中的任意成员。声明友元类的格式是friend class 类名,声明同样可以再类中的任意部分。
给出一个例子,在dev c++上可以顺利编译并执行。
例子中的father类和son类只是两个类的名称,不是真的一个是父类,一个是子类哈(因为时间关系,就没有重新想类的名字并修改了……)
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;
class father
{
friend void hanshu1(father f);//声明了一个友元函数
friend class son;//声明了一个友元类
public:
void a(int);
int a1=111;
protected:
void c(int);
int c1=222;
private:
void e(int xingcan)
{
cout<<"形参是"<<xingcan<<endl;
}
int e1=333;
};
void hanshu1(father f)//友元函数的实现
{
cout<<f.a1<<endl;
cout<<f.c1<<endl;
cout<<f.e1<<endl;
f.e(123);
}
class son//友元类的实现
{
public:
void g(father f)
{
cout<<f.a1<<endl;
cout<<f.c1<<endl;
cout<<f.e1<<endl;
f.e(123);
}
};
int main()
{
father father1;
hanshu1(father1);
son son1;
son1.g(father1);
return 0;
}
可以结合上述例子理解一下友元函数和友元类怎么操作~
友元类的一些性质:
①友元关系不能被继承,也就是说如果类B是类A的友元类,类C是类B的子类,那么类C不一定是类A的友元类,只有在类A中特殊声明过的类才是类A的友元类。
②友元关系是单向的,类B是类A的友元类,但是类A不一定是类B的友元类。
③友元关系不具有传递性,类B是类A的友元类,类C是类B的友元类,但是类C不一定是类A的友元类,同样需要在类A中特殊声明一下才是友元类。但是我们类C实际上可以通过访问类B来访问类A,只不过不能直接访问类A。
原文链接:https://www.cnblogs.com/chenjx85/p/10478340.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash