首页 > 其他分享 >类的访问控制

类的访问控制

时间:2024-05-24 20:40:24浏览次数:19  
标签:调用 函数 访问控制 成员 int 对象 内联

this关键字

this是一个指向当前对象实例的指针,主要用于类的成员函数中。
它允许成员函数访问调用该函数的对象。
主要用法:
1、访问成员变量:当成员函数中的局部变量名与类的成员变量名相同时,可以使用this指针来区分它们。

class MyClass
{
private:
	int value;
public:
	void setValue(int newValue)
	{
		this->value = newValue;  //这个类的value = newValue
	}
}

2、返回当前对象的引用:this可以用来返回当前调用对象自身的引用。
这在链式调用模式中非常有用。

class MyClass {
    public:
        MyClass& setA(int a) {
            // 设置属性A
            return *this; // 返回this,允许链式调用
        }
        
        MyClass& setB(int b) {
            // 设置属性B
            return *this; // 返回this,允许链式调用
        }
    };
    MyClass obj;
    obj.setA(10).setB(20); // 链式调用

3、作为函数参数传递:尽管不常见,this指针可以作为参数传递给其他函数。
这在特定情况下,如实现回调函数时可能有用。

    class MyClass {
    public:
        void doSomething() {
            // 调用外部函数,并传递this指针
            externalFunction(this);
        }
    };
    void externalFunction(MyClass* obj) {
        // 使用obj指针操作MyClass对象
    }

4、静态成员函数中的限制:静态成员函数没有this指针,因为它不依赖于特定的对象实例。
如果你尝试在静态成员函数内部使用this,编译器将会报错。

5、友元函数中的限制:友元函数虽然不是类的成员,但如果它们需要访问类的非静态成员,可以通过传递对象指针或引用来使用this。
然而,友元内部不允许直接使用this,因为它不是类的成员函数。

内联函数

在编译时展开,减少运行时开销的一种优化技术。
内联函数通过在编译期间将函数调用点替换为函数本体代码的方式,避免了函数调用过程中涉及到的开销(栈帧的创建和销毁、参数的传递、返回地址的管理等),提高了程序执行的速度。

定义和使用内联函数:
在函数声明前加上inline关键字来定义一个内联函数。
如:

inline int add(int a, int b)
{
	return a + b;
}

或者,对于类成员函数:

class Myclass
{
public:
	inline int add(int a, int b)
	{
		return a + b;
	}
}

通过inline关键字声明,也可以在类的cpp文件里定义函数时在前面指明inline。
一个类的成员函数在类的头文件实现了,拿它也是内联函数。

最好只在类外部定义的地方说明inline,这样可以使类更容易理解。

特点:
1、编译时展开:内联函数的代码在编译期间直接插入到调用处,而不是通过函数调用的方式执行。这意味着内联函数没有函数调用的开销。
2、代码膨胀:由于内联函数的代码会在每个调用点展开,如果内联函数体很大或者被频繁调用,可能会导致最终的可执行文件体积增大。
3、不一定总是内联:如果函数体过于复杂,编译器可能会选择不内联该函数以免代码膨胀.

使用场景:
1、小型函数
2、频繁调用的函数
3、避免函数调用的开销

mutable机制

mutable关键字提供了一种机制,允许类的成员变量在const成员函数中被修改。
通常情况下,当成员函数被声明为cosnt时,它不能修改类的任何成员变量。
但是,可以通过将某个变量声明为mutable,可以解除这一限制,使得这些变量即使在const成员函数中也能被修改。

使用场景:
1、缓存值:有时,计算某个成员变量的值可能很昂贵,但在const成员函数中需要频繁访问这个值。
通过将这个变量声明为mutable,可以在const成员函数中缓存并更新这个值,而不会违反const成员函数不改变对象状态的约定。
2、计数器或状态标志:在某些情况下,可能需要跟踪const成员函数被调用的次数,或者记录对象的状态。
使用mutable成员变量可以方便地实现这一点,而不影响const成员函数的语义。

链式调用

链式调用是一种编程技术,它允许在一个对象上连续调用多个方法。
优点:大幅减少代码量,使得代码逻辑更加清晰。
核心:在于每个函数在执行完操作后,返回对象本身的引用(通常返回this或者* this),这样就可以在返回的对象上继续调用方法,形成链式效果。

关键点:
1、返回对象引用:每个函数在执行操作后,需要返回对象本身的引用,而不是返回拷贝。
2、状态改变:每个链式方法会改变对象的状态,这样链式下去,对象状态会不断改变。
3、引用传递:链式调用都是简历在对象引用的基础上,采用引用传递而不是值传递。这样对对象的操作就是对同一个对象的实例进行的。
4、无需临时变量:链式调用让代码更简洁,避免定义许多临时变量,直接通过方法链表达一个操作流程。

#include <iostream>
class Calculator {
public:
    Calculator& add(int value) {
        result += value;
        return *this;  // 返回对象本身
    }
    Calculator& multiply(int value) {
        result *= value;
        return *this;  // 返回对象本身
    }
    void display() {
        std::cout << "Result: " << result << std::endl;
    }
private:
    int result = 0;
};
int main() {
    Calculator calc;
    calc.add(5).multiply(3).add(2).multiply(4).display(); // 链式调用
    return 0;
}

标签:调用,函数,访问控制,成员,int,对象,内联
From: https://www.cnblogs.com/H43724334/p/18211582

相关文章

  • Nginx请求访问控制是怎样实现的 转载
    目录漏桶算法(LeakyBucket):令牌桶算法(TokenBucket):ngx_http_limit_req_module(限制请求)配置实例ngx_http_limit_conn_module(限制连接数)配置实例 首先来看下什么是漏桶算法和令牌桶算法Nginx并不直接实现漏桶算法或令牌桶算法,但这些算法在控制网络流量和请求......
  • Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略
    CiscoIdentityServicesEngine(ISE)3.3Patch2-基于身份的网络访问控制和策略实施系统思科身份服务引擎(ISE)-下一代NAC解决方案请访问原文链接:CiscoIdentityServicesEngine(ISE)3.3Patch2-基于身份的网络访问控制和策略实施系统,查看最新版。原创作品,转载......
  • 基于角色的访问控制并根据不同的场景显示不同的反馈信息
    要实现基于角色的访问控制(RBAC),并根据不同的场景(如菜单项、页面、组件)显示不同的反馈信息(如隐藏、禁用、提示等),可以设计一套完整的解决方案。这个方案需要结合权限管理、上下文、路由控制和条件渲染等多个方面。以下是一个详细的实现方案:1.设置角色和权限首先,定义你的角色和权限......
  • Nginx请求访问控制是怎样实现的
    首先来看下什么是漏桶算法和令牌桶算法Nginx并不直接实现漏桶算法或令牌桶算法,但这些算法在控制网络流量和请求速率方面非常有用。这些算法通常在网络编程、API服务、负载均衡等领域中使用,以确保系统的稳定性和性能。漏桶算法(LeakyBucket):*漏桶算法用于限制数据的传输速率。它......
  • openGauss 行级访问控制
    行级访问控制行级访问控制特性将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作,读取到的结果是不同的。用户可以在数据表创建行访问控制(RowLevelSecurity)策略,该策略是指针对特定数据库用户、特定SQL操作生效的表达式。当......
  • Azure Storage (30) 基于属性的访问控制(ABAC)
    《WindowsAzurePlatform系列文章目录》 我们在使用AzureStorage的时候,经常会基于属性来进行访问控制,我们假设一个场景1:(1)用户:productionuser01可以访问到container以production开头的文件内容,如contoso.blob.core.windows.net/production01contoso.blob.c......
  • C++ 类方法解析:内外定义、参数、访问控制与静态方法详解
    C++类方法类方法,也称为成员函数,是属于类的函数。它们用于操作或查询类数据,并封装在类定义中。类方法可以分为两种类型:类内定义方法:直接在类定义内部声明和定义方法。类外定义方法:在类定义内部声明方法,并在类外部单独定义方法。类内定义方法在类定义内部可以直接声明和......
  • 搭建vsftpd实现虚拟用户访问控制
    搭建vsftpd实现虚拟用户访问控制场景实例:创建admin虚拟用户,允许上传下载删除重命名任何文件user1虚拟用户,允许上传下载不允许删除和重命名文件匿名用户可以看到pub空间,但不能上传下载删除任何文件[root@localhost~]#systemctlstopfirewalld[root@localhost~]#setenf......
  • openGauss 访问控制模型
    访问控制模型可获得性本特性自openGauss1.1.0版本开始引入。特性简介管理用户访问权限,为用户分配完成任务所需要的最小权限。客户价值客户依据自身需求创建对应的数据库用户并赋予相应的权限给操作人员,将数据库使用风险降到最低。特性描述数据库提供了基于角色的访问控制......
  • openGauss 行级访问控制
    行级访问控制可获得性本特性自openGauss1.1.0版本开始引入。特性简介行级访问控制特性将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作,读取到的结果是不同的。客户价值不同用户执行相同的SQL查询操作,读取到的结果是不同......