滴水三期:day44.1-private和class权限控制.

C++之类(class)的三种成员修饰符(public、private、protected)总结 主要介绍类中修饰词public、private、protected控制成员访问权限 阅读详情

一、方法定义和实现分开

  • 将声明与实现分离,代码会有更好的可读性,不是必须的

  • 选择项目Class View,右键新建Class;在xxx.h头文件中定义类,且只声明成员方法:

    struct Person{
    	int x;
    	void setx(int x);
    	int getx();
    };
    
  • ,在xxx.cpp中实现方法:(但是要告诉编译器,这不是一个普通的函数,而是Person类中的成员方法)

    void Person::setx(int x){
    	this->x = x;
    }
    int Person::getx(){
    	return this->x;
    }
    
  • 最后在要使用Person类中成员的cpp中include xxx.h引用头文件,就可以使用xxx.h中类创建对象,使用其属性和方法

    #include "stdafx.h"
    #include "MyClass.h"
    int main(int argc, char* argv[]){		
    	Person p;
    	p.setx(1);
    	printf("%d\n",p.getx());
    	return 0;	
    }
    
  • 特别说明:

    • xxx.h只是一个文件,头文件可以是任何的后缀名,不一定是.h,比如可以叫xxx.exe
    • #include 的作用只是把里面的内容复制过来,仅此而已
    • xxx.h 与 xxx.cpp并不要求一定同名

二、public和private

1.public权限说明

  • public权限:这个成员(属性、方法等)哪里都可以用,所以对外提供的函数或者变量,发布成public的
  • public/private可以修饰函数也可以修饰变量
  • 注意:目前阶段,类的构造器只能设置成public。后面学习设计模式时定义成private也有办法使用。

2.private权限说明

  • private权限:这个成员只用于类内部使用,即只有结构体内部的函数才可以访问private的成员,不能在其他的地方使用,所以不对外公布的,发布成private

  • 一般来说类的成员变量不能让别人轻易改动,如果要改动,也必须要对修改的值进行判断检验是否合法,所以一般都会对外发布可以修改或打印私有成员变量的方法,在方法中检验修改是否合法:

    #include "stdafx.h"	
    struct Person{
    private:   //私有成员变量
    	int age;
    public:  //共有成员方法
    	void SetAge(int age){
    		if(age > 0 && age <= 100){
    			this->age = age;  //private成员变量只有类中的其他成员可以访问
    		}
    	}
    	int GetAge(){
    		return age;
    	}
    };
    int main(int argc, char* argv[]){		
    	Person p;
        //不能p.age = 18;
    	p.SetAge(18);
    	printf("%d\n",p.GetAge());
    	return 0;	
    }
    
1)private成员分配空间
  • 当创建一个类的对象时,不管是公有变量还是私有变量,编译器分配空间时都一视同仁,还是会分配空间,只不过我们要使用私有变量时,编译器是不允许的

    #include "stdafx.h"	
    struct Person{
    private:
    	int x;
    	int y;
    public:
    	int z;
    	void Init(int x,int y,int z){
    		this->x = x;
    		this->y = y;
    		this->z = z;
    	}
    };
    int main(int argc, char* argv[]){		
    	Person p;
    	p.Init(1,2,3);
        printf("%d\n",sizeof(p));  //12,从这里也可以发现,不管私有还是公有成员变量,都会为其分配空间
    	return 0;	
    }
    

    查看反汇编发现:创建p对象后,最后一个参数就是对象的首地址,所以ebp-0xC也是成员x的地址,存到ecx寄存器中;接着进入到函数内部,ecx中就是x的地址(即对象首地址),然后把x的地址值存入到ebp-4,接着又把地址值存入到eax,所以mov dword ptr [eax],ecx就是在给成员x赋值;接着又把x的地址值存入到edx,所以[edx+4]中存的就是y;后面以此类推。还可以通过栈窗口发现,x,y,z成员就是挨着存的,看不出来哪一个是private哪一个是public

    image-20230424172836727 173205 image-20230424173648373
2)private成员变量其实可以访问
  • 前面讲过,不管是private成员变量还是public成员变量,在内存中都是一视同仁,就存储在对象的内存空间中,所以可以用指针访问即可

    #include "stdafx.h"	
    struct Person{
    private:
    	int x;
    	int y;
    public:
    	int z;
    	void Init(int x,int y,int z){
    		this->x = x;
    		this->y = y;
    		this->z = z;
    	}
    };
    int main(int argc, char* argv[]){		
    	Person p;
    	p.Init(1,2,3);
        
    	int* pp = (int*)&p;  //定义一个int*指针,访问x,y,z的值即可
    	printf("%d %d %d\n",*pp,*(pp + 1),*(pp + 2));  //1 2 3
    	return 0;	
    }
    
  • 所以再次印证了:private修饰的成员与普通的成员没有区别 只是编译器会检测

三、class和struct区别

  • 编译器默认class中的成员为private,而struct中的成员为public

  • 继承中的区别:

    • 如果一个子类继承一个父类时,没有声明以什么方式继承,默认以private的方式继承,即继承(复制)过来的成员都是私有的!

      #include "stdafx.h"	
      class Person{
      private:
      	int x;
      	int y;
      public:
      	int z;
      	void Init(int x,int y,int z){
      		this->x = x;
      		this->y = y;
      		this->z = z;
      	}
      };
      class Student:Person{  //由于这里没有声明以什么方式继承,默认以private方式继承
      private:
      	int m;
      public:
      	void changeZ(){
      		//z = 10;   //因为以private方式继承,即使父类中的z是public,但是继承来后就变成private
      		//x = 1;    //x本来就是私有的,当然使用不了
      	}
      };
      int main(int argc, char* argv[]){		
      	
      	return 0;	
      }
      
    • 如果子类中想使用父类中的public的变量或方法,就需要声明以public的方式继承

      class Student:public Person{  //以public方式继承
      private:
      	int m;
      public:
      	void changeZ(){
      		z = 10;   //因为以public方式继承,所以可以使用父类中public的成员
      		//x = 1;    //x本来就是私有的,当然使用不了
      	}
      };
      
    • 但是注意:父类中的私有成员是会被继承的,即还是会为私有成员变量分配空间,只是子类中无法使用父类的私有成员变量(所以说嘛,子类对象想访问父类中的私有成员变量,也是有办法的,和上面一样)

      #include "stdafx.h"	
      class Person{
      private:
      	int x;
      	int y;
      public:
      	int z;
      	Person(){
      		this->x = 1;
      		this->y = 2;
      		this->z = 3;
      	}
      };
      
      class Student:public Person{
      private:
      	int m;
      public:
      	void changeZ(){
      		m = 4;
      	}
      };
      int main(int argc, char* argv[]){		
      	Student stu;  //创建子类对象时,是会先调用父类的构造器的!所以x,y,z才会被赋值1,2,3
      	stu.changeZ();
      
      	int* stup = (int*)&stu;
          printf("%d\n",sizeof(stu)); //16,说明父类中无论私有公有的成员变量都被继承过来了
      	printf("%d %d %d %d\n",*(stup),*(stup + 1),*(stup + 2),*(stup + 3)); //1 2 3 4
      	return 0;	
      }
      

四、作业

1.class和private练习

  • 将上一节课的所有练习改为class实现,并添加private/public进行权限控制,而且将类的定义与实现分开来写:定义写到xxx.h中,函数实现写在xxx.cpp中

  • 在MyClass.h中声明DataInfo类,TimeInfo类:

    #if !defined(AFX_MYCLASS_H__44CA5D47_B224_42F2_A26E_CAD8CD157CD1__INCLUDED_)
    #define AFX_MYCLASS_H__44CA5D47_B224_42F2_A26E_CAD8CD157CD1__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    class DataInfo{
    private:
        int year;
    	int month;
    	int day;
    public:
    	DataInfo(int year,int month,int day){
    		this->year = year;
    		this->month = month;
    		this->day = day;
    	}
    	DataInfo(){
    		year = 2015;
    		month = 4;
    		day = 2;
    	}
                                      
    	void SetDay(int day);
    	int GetDay();
    	void SetYear(int year);
    	int GetYear();
    	void SetMonth(int month);
    	int GetMonth();
    };
    class TimeInfo:public DataInfo{
    private:
    	int hour;
    	int minute;
    	int second;
    public:
    	void SetHour(int hour);
    	void SetMinute(int minute);
    	void SetSecond(int second);
    	int GetHour();
    	int GetMinute();
    	int GetSecond();
    };
    #endif // !defined(AFX_MYCLASS_H__44CA5D47_B224_42F2_A26E_CAD8CD157CD1__INCLUDED_)
    
    184641
  • 在MyClass.cpp中实现方法:

    #include "stdafx.h"
    #include "MyClass.h"
    void DataInfo::SetDay(int day){
    	this->day = day;
    }
    int DataInfo::GetDay(){
    	return day;
    }
    void DataInfo::SetYear(int year){
    	this->year = year;
    }
    int DataInfo::GetYear(){
    	return year;
    }
    void DataInfo::SetMonth(int month){
    	this->month = month;
    }
    int DataInfo::GetMonth(){
    	return month;
    }
    
    void TimeInfo::SetHour(int hour){
    	this->hour = hour;
    }
    void TimeInfo::SetMinute(int minute){
    	this->minute = minute;
    }
    void TimeInfo::SetSecond(int second){
    	this->second = second;
    }
    int TimeInfo::GetHour(){
    	return hour;
    }
    int TimeInfo::GetMinute(){
    	return minute;
    }
    int TimeInfo::GetSecond(){
    	return second;
    }
    
    184831
  • 最后在要使用的cpp中包含MyClass头文件,创建对象并使用成员方法打印日期:

    #include "stdafx.h"
    #include "MyClass.h"
    void Test(){
    	//访问TimeInfo对象的成员
    	TimeInfo t;
    	t.SetHour(21);
    	t.SetMinute(8);
    	t.SetSecond(52);	
    	printf("%04d.%02d.%02d - %02d:%02d:%02d\n",t.GetYear(),t.GetMonth(),t.GetDay(),t.GetHour(),t.GetMinute(),t.GetSecond());
    }
    int main(int argc, char* argv[]){		
    	Test();
    	return 0;	
    }
    
    185024
NVMe-MI --- Message Servicing Model(消息服务模型) 本文主要介绍NVMe-MI消息服务模型,两个主要类别是请求消息和响应消息。并介绍带外机制消息服务状态机。 阅读详情

相关推荐

VSCode 远程开发:实现服务器图形化界面(GUI)的高效操作指南

本文详细介绍了如何通过VSCode远程开发实现服务器图形化界面(GUI)操作,包括X11转发原理、完整配置指南和实战测试。通过安装Xming、配置SSH连接和服务器端设置,开发者可以高效地在本地显示远程GUI应用,提升开发效率。

weixin_29245767的博客 293

类里面的私有类 的作用和用法

私有类只能在外部类的成员函数中使用,对于外部类的用户来说是不可见的。通过将一些相关的功能和数据封装在私有类中,可以隐藏实现细节,只暴露外部类的公共接口给用户,提高代码的可维护性和安全性。通过将复杂性封装在私有类中,可以使外部类的接口更简洁、易于使用,并且用户不需要了解私有类的内部实现。限制访问权限:私有类只能在外部类的成员函数中使用,对于外部类的用户来说是不可见的。实现内部辅助功能:私有类可以用于实现外部类的内部辅助功能。它可以访问外部类的私有成员,并提供一些辅助函数或数据结构,用于支持外部类的实现。

sunfanup的博客 1361

分布式 Agent 系统设计:高并发场景下的挑战与解决方案

分布式 Agent 系统由多个分布在不同节点上的智能 Agent 组成,这些 Agent 具有自主决策能力,能够通过通信协作完成复杂任务。每个 Agent 可以看作是一个独立的实体,具备感知环境、处理信息、执行动作的功能,它们相互协作,共同实现系统的整体目标。分布式 Agent 系统在高并发场景下面临着资源调度、通信延迟、状态一致性、容错处理和性能瓶颈等诸多挑战。通过采用动态资源分配、高效通信协议、分布式共识算法、冗余备份等解决方案,可以有效应对这些挑战,提高系统的性能、可靠性和可用性。

shuizhudan223的博客 1292

使用private修饰内部类

public class OuterClass { private class InnerClass { public void print() { System.out.println("打印内部类 "); } } public static void main(String[] args) { ...

岳豪的博客 4515

AI大模型API中转站选型指南:12项关键指标与实战评估

随着AI大模型技术的快速迭代,企业面临着一个核心挑战:如何在基础模型频繁更新的背景下,为业务系统选择稳定可靠的API中转服务?本文基于真实生产环境测试数据,从12个关键维度系统评估主流API中转站平台,帮助技术团队在模型快速演进的生态中做出科学选型决策。 1. API中转站的核心价值与业务场景 1.1 什么是API中转站 API中转站(API Gateway/Aggregator)是连接业务系统与多个大模型厂商的中间层服务。它通过统一的接口封装了不同厂商的API协议差异,为企业提供标准化的模型调用能力。在实

weixin_29056101的博客 446

Nacos漏洞利用工具V3.0.5实战:从认证绕开到内存马植入的全流程指南

本文详细解析了Nacos漏洞利用工具V3.0.5在实战中的应用,从认证绕开到内存马植入的全流程。文章深入探讨了如何利用Nacos的历史漏洞,如默认口令、认证逻辑绕过、Derby SQL注入及Jraft反序列化,实现权限提升与持久化控制,并提供了防御视角与加固建议,旨在帮助安全人员理解攻击链以加强防护。

h6j7k8l9p0的博客 483

class类中private,public,static,protected

都是受保护的属性和方法,可以在当前类及其子类中访问,但是无法在其他地方访问。这种访问控制用于实现类的继承关系,允许子类访问父类的受保护状态,但是不允许外部代码访问或修改。属性或方法只能在类的内部访问,其他地方都无法访问,包括子类也不能直接访问。属性或方法是类的静态成员,它们与类本身而不是实例相关联,可以在类的内部和外部直接使用,不需要实例化对象。是默认的访问修饰符,表示公有的属性或方法可以在类的内部和外部使用。同时,受保护的属性和方法也可以被子类覆盖,实现多态的效果。子类也可以继承访问,但是无法重写。

qq_41538952的博客 2053

vue3 - element-plus表格组件el-table实现鼠标拖曳排序功能,vue3 Table表格拖拽排序,表格每行使用鼠标拖动进行排序功能,表格拖拽排序实现(详细示例代码,一键复制开箱即用

vue3,elementPlus,el-table,typescript,表格组件,Table表格,表格拖动排序,表格拖曳排序,鼠标拖拽表格进行排序功能,elementplus表格如何实现拖动每行进行排序操作,表格拖动改变顺序,鼠标拖曳,表格内的数据项拖拽排序,vue3如何实现element-Plus表格组件进行表格内的数据项拖拽排序,列表拖拽排序效果,实现table动态拖拽,鼠标拖着排序,vue3 element Plus 表格拖曳拖动拖拽 排序,el-table拖拽排序实现,表格内容拖拽重新排序,树形表

✅ 精选推荐文章 1万+

C++之 class 的三种访问修饰符( public、private、protected )

类的语法定义形式: class B { public: //公有成员 private: //私有成员 protected: //受保护成员 }: 公有(public)成员:在程序类的外部可以访问 #include&lt;iostream&gt; using namespace std; class area { public: //公...

gxgalaxy 2万+

如何用libwebsocket库在stm32F407上实现websocket客户端?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1135

AI爬虫:一文讲通AI爬虫技术和原理,及34个AI爬虫工具推荐

AI 爬虫 是一种结合了传统网络爬虫技术和人工智能(AI)技术的工具,能够更智能、高效地从网页中提取和处理数据。与传统爬虫相比,AI 爬虫能够更好地处理动态内容、复杂网页结构以及非结构化数据,同时具备数据清洗、分类、情感分析等高级功能。

数据知道的博客 1万+

java内部私有类

1.什么是内部私有类? 在一个java类里创建一个private的class; 2.内部私有类的功能: 在大部分的java编码中,我们的编码都是依赖于class的,但内部类可以实现无依赖类型编码; 对外部而言,可以完全隐藏实现的细节; 3.具体实现: 1)定义接口(为内部类方法的访问做准备): package think.ten; public interface Cont

BoneToBone的博客 1万+

ubuntu linux虚拟机安装部署openclaw详细教程(安装、问题处理)

本文详细介绍了在Ubuntu系统下安装OpenClaw AI助手的完整流程及常见问题解决方案。主要内容包括:1) 通过GIT、Node.js等基础环境配置;2) 使用官方脚本或源码编译两种方式安装OpenClaw;3) 配置向导中的关键选项说明;4) 针对systemctl服务启动失败等常见错误的处理方法。文章特别强调了权限管理、网络依赖和访问配置等易错环节,提供了修改service文件等具体解决方案,帮助开发者顺利完成部署并实现Web UI访问。教程实操性强,适合本地和云服务器环境部署参考。

少说,多做 2032

Java学习笔记

个人Java初学笔记

weixin_50893467的博客 430

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

private class java_Java_为什么说private是对类的不是对对象的

今天,我在中国大学MOOC上学习浙江大学翁恺老师的Java课程的时候,翁恺老师在讲解对象交互中成员属性这一部分时,是这样描述private的访问属性的。(图1)图1.Java类中privare的访问属性private1) 只有这个类内部可以访问2) 类内部指类的成员函数和定义初始化3) 这个限制是对类的而不是对对象的翁恺老师在课后讨论中给我们留下了这样的一个问题。图2.中国大学MOOC 面...

weixin_39918043的博客 980

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

坚持学习100天:Class 类(public,private,protected)

前言 Hello,我是修齊。 学习C++的第一百零五天,用心学习。 在这里记录一些学习的东西和学习的心情,内容主要是一些自己学习整理的小笔记。 一、结构与类 1.结构体默认情况下:成员是公有的(public) 2.类默认情况下:成员是私有的(private) 3.类和结构使用的关键字不同,成员访问控制方面有差异 4.Microsoft为Visual C++集成了许多类,成为MFC(微软基础类库) 5.class <大写开头类名> 二、从结构到类 1.C++中,结构体可以包含变量 struc

m0_55732114的博客 2662

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Class类中的public、private、protected修饰符

2.当private标记的成员来自同一出处的时候,则可以兼容,如果为不同出处则不行。protected和private作用相似,在类的外部仍然不能访问基类的私有成员,1.当成员被标记为私有时,它就不能在类的外部被访问。但在派生类中可以访问基类的私有成员。

Tonghanhan的博客 4033

private能否修饰顶层类?

对于顶层类(外部类)来说,只有两种修饰符:public和默认(default)。 因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。 因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。 但是p

lolashe 6053

Java中的私有权限(private)

安全隐患问题 :属性赋值,值有可能出现符合类型范围要求但是不符合业务要求的数据(也就是某些值只有自己能使用,别人不能用的使用,我们要把值进行私有化修饰) private: 私有的 作用:被private关键字修饰的内容只能在本类中使用,其他类中无法使用 访问:私有属性需要配合提供一对公共的访问方式--> 方法,因为在方法中可以做逻辑判断 1、设置器 setter : 为私有属性设置值 2、访问器 getter : 获取私有属性 注意: 定义实体类时属性都需要私有化,并且提供一对公共的访问方

m0_67474817的博客 1万+

访问权限修饰符(public、protected、private)、封装(私有化类属性、私有化类的某些方法)

如:单例模式:单个实例,在系统中,想让某个类只能创建一个对象(如计算机电脑上的任务管理器在Windows系统下只能创建一个)(1)修饰对象:类(包括正常类和内部类)、成员变量、方法(包括构造方法和成员方法)(1)修饰对象:类(包括正常类和内部类)、成员变量、方法(包括构造方法和成员方法),必须通过类中提供的方法来实现对隐藏信息的操作(赋值)和访问(取值)(2)权限范围:被修饰对象只能在本类、同包类、不同包子类中被访问。(1)隐藏了类的某些信息,保护了类中属性的数据值。

Watermelon_Mr的博客 5292

c++类和对象

在c++中,关键字class代表创建一个类,在类里面有三种访问限定符:public代表公有、private代表私有、protected代表保护,公有的谁都可以访问,私有和保护的,除了类里面的都访问不了,在类里面也会有内存对齐,且类里面的函数不会算内存。在没有写限定符的情况下class默认是private,struct默认是public。c++对struct进场了升级,让struct也可以定义类。类的成员函数默认都会在形参第一个位置,增加一个当前类型的指针,叫做this指针。

2402_84103499的博客 672

private的访问权限

非常基础的概念问题 第一:private, public, protected 访问标号的访问范围。 private :只能由1.该类中的函数、2.其友元函数访问。 不能被任何其他访问,该类的对象也不能访问。 protected :可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。 但不能被该类的对象访问。 public :可以被1.该类中的...

yangactive的专栏 3525

java class private_Java class 中public、protected 、friendly、private的区别

转载自:http://hi.baidu.com/ceoct/item/7e136a2417ba6f896f2cc33cJava class 中public、protected 、friendly、private的区别1.类(class)可见性修饰符: public—在所有类中可见,在其他包中可以用import导入。缺省—就是没有修饰符,在同一个包中的类中可见,在其他包中不能用import导入。修饰...

weixin_36215736的博客 1639

php class private,php class中public,private,protected的区别以及实例分析

一,public,private,protected的区别public:权限是最大的,可以内部调用,实例调用等。protected: 受保护类型,用于本类和继承类调用。private: 私有类型,只有在本类中使用。二,实例error_reporting(E_ALL);class test{public $public;private $private;protected $protected;st...

weixin_35808698的博客 399

java class private_Java核心(二):四种权限修饰符的区别、private是否能够修饰class...

public:可以被所有其他类所访问protected:自身、子类及同一个包中类均可以访问default:同一包中的类可以访问,声明时没有加修饰符,认为是friendlyprivate:只能被自己访问和修改二、Java的外部类为什么不能使用private、protected进行修饰对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只...

weixin_39627665的博客 359

class修饰符public、private、protected、static、abstract

class修饰符的使用及区别 public、private、protected、static、abstract public:可以继承、实例化 class Person { public name: string; constructor(thename: string) { this.name = thename; } } class Jack extends Person { ...

ygunoil的博客 433
上一篇: 滴水三期:day43.1-构造、析构函数和继承
下一篇: 滴水三期:day44.2-虚函数表
EdimadeZhou
博客等级 码龄5年 241粉丝 128原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值