关于c++类的一些知识的总结
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。
关于c++类的一些知识的总结的更多相关文章
- python类的相关知识第二部分
类的继承.多态.封装 一.类的继承 1.应用场景: 类大部分功能相同,大类包含小类的情况 例如: 动物类 共性:都要吃喝拉撒.都有头有脚 特性: 猫类.走了很轻,叫声特别,喜欢白天睡觉 狗类.的叫声很 ...
- Google类VR设备知识
前言 本文所指的google类vr设备是指: 谷歌的Cardboard.三星Gear VR.暴风魔镜等这样的手机VR盒子,而并不是HTC Vive这类. 人眼立体感知能力 人的左右眼看到的东西是有差别 ...
- UML 类图基础知识记录
UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 依赖(Dependency): 关联(Association): 聚合(Aggregation): 合成(Composition): 泛化 ...
- 深入理解ES6之——JS类的相关知识
基本的类声明 类声明以class关键字开始,其后是类的名称:剩余部分的语法看起来像对象字面量中的方法简写,并且在方法之间不需要使用逗号. class Person { //等价于prototype的构 ...
- 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...
- Es6对象的扩展和Class类的基础知识笔记
/*---------------------对象的扩展---------------------*/ //属性简写 ,属性名为变量名, 属性值为变量的值 export default functio ...
- C++ 类模板基础知识
类模板与模板类 为什么要引入类模板:类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类 ...
- python类的相关知识第一部分
一.类的相关概念 (1).什么是类 具有同种属性的对象称为类,是个抽象的概念.比如说:汽车.人.狗.神: (2).什么是对象或实例 日常生活中的所有东西都是对象,是类的实例化.比如说:推土车是汽车的实 ...
- python 面向对象与类的基本知识
一 什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...
随机推荐
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- s4-9 二层设备
二层(数据链路层)设备有哪些? 网卡 网桥 交换机 NIC 网卡 Nework Interface Card 为主机提供介质的访问. MAC地址烧在网卡的 ROM中 NIC 网 ...
- HDU 1536 S-Nim (组合游戏+SG函数)
题意:针对Nim博弈,给定上一个集合,然后下面有 m 个询问,每个询问有 x 堆石子 ,问你每次只能从某一个堆中取出 y 个石子,并且这个 y 必须属于给定的集合,问你先手胜还是负. 析:一个很简单的 ...
- Json跨域请求数-Jquery Ajax请求
同步请求,async(是否异步) //同步请求,等待并接收返回的结果 var result = $.ajax({ type: "GET", url: address, async: ...
- 20155205 2016-2017-2 《Java程序设计》第9周学习总结
20155205 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC简介 厂商在实现JDBC驱动程序时,依方式可将驱动程序分为四种类型: JD ...
- redis.conf之save配置项解读
配置示例: save 900 1 save 300 10 save 60 3600 配置解读: 1) “save 900 1”表示如果900秒内至少1个key发生变化(新增.修改和删除),则重写rdb ...
- 屏幕抓取程序 (位图DDB的例子)
屏幕抓取程序的意思是将整个屏幕图显示在应用程序的用户区中,等价于截图.对桌面窗口的操作:首先得知道桌面窗口的宽和高,获取宽和高需要利用窗口的设备句柄,而获取设备句柄需要知道窗口句柄,这一系列的连串关系 ...
- 【转】Javascript基本类型和引用类型的区别
根据[转贴]进一步补充 今天明白了一个困扰很久的问题:引用类型和基本类型的区别与联系要明白这个问题,首先需要理解堆栈的概念.那什么又是堆栈,有什么区别和联系呢?堆:首先堆是动态分配的,JVM并不会自动 ...
- 1.8.2suspend与resume方法的缺点-独占
这两个方法使用不当,容易造成公共的同步对象的独占,使得其他线程无法访问公共的同步对象 测试 package com.cky.bean; /** * Created by edison on 2017/ ...
- Ubuntu下安装并配置TexStudio
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7069715.html Ubuntu下安装并配置TexStudio Ubunt ...