C++(04) 成员变量设置为私有,以及get/set方法

本文详细比较了C++中struct和class的关键区别,包括默认访问权限、成员变量的get/set方法(按值与常量引用)、参数传递效率以及内存使用。着重讲解了使用const修饰符优化的内存和效率优势。
摘要由CSDN通过智能技术生成

class和struct的区别

在 C++ 中,struct 和 class 是用于定义自定义数据类型(类)的关键字。它们在语法上有一些区别,但在功能上基本相同,可以包含属性、方法、构造函数、析构函数等,并且可以实现封装、继承和多态等面向对象编程的特性。

二者的本质区别:在权限上有所不同,在 struct 中,默认的访问权限是公共的(public),而在 class 中,默认的访问权限是私有的(private)。这意味着在 struct 中定义的成员(属性和方法)默认为公共访问权限,而在 class 中定义的成员默认为私有访问权限。

class中的成员变量

成员变量或函数如果不加修饰,默认是private,只能在本类中进行访问,外部的类无法进行访问。

class Person {
//class的默认访问权限是private
    string m_Name;//姓名

    int m_Age;//年龄

    string m_Idol;//偶像
}

get/set方法 

第一种:

    //设置姓名
    void setMName(string name) {
        m_Name = name;
    }

    //获取姓名
    string getMName() {
        return m_Name;
    }

 参数传递方式:setMName 函数的参数是按值传递的,按值传递会进行一次参数值的复制操作。setMName() 的参数类型是 string,表示传入的值是 string 类型的副本。每次调用该函数时都会进行一次值的复制操作。

 返回值类型:getMName 函数返回值类型是 string,表示返回私有成员变量 m_Name 的副本。这表示:外部代码可以读取该副本的值,并且对副本的修改不会影响到原始成员变量。

第二种:

    //设置姓名
    void setMName(const string &mName) {
        m_Name = mName;
    }

    //获取姓名
    const string &getMName() const {
        return m_Name;
    }
    

参数传递方式: setMName 函数是一个设置成员变量值的函数,参数 mName 是一个 const 引用,表示传入的值不会被修改。通过将传入的值赋给私有成员变量 m_Name,来改变对象的状态。函的参数是通过常量引用传递。而常量引用传递避免了额外的复制,直接引用传入的参数。这样的设计可以避免不必要的复制操作,并且表明该函数不会修改传入的值。

返回值类型:getMName 函数是一个只读成员函数,返回值类型是 const string&,表示返回一个对私有成员变量 m_Name 的常量引用。使用了 const 修饰符修饰了函数本身,表示该成员函数不会修改对象的状态。这样的设计可以防止外部代码修改私有成员变量,但可以通过该函数获取私有成员变量的值。即,外部代码只能读取到该成员变量的值,但不能修改它。

    //获取姓名
    const string &getMName() const {
        return m_Name;
    }
    

第一个 const 关键字:

函数的返回类型为 const string & ,即返回一个常量引用,调用者只能通过该引用读取对象的值,不能修改(只读的)。

位于函数声明的返回类型之前,表示函数返回的是一个常量引用。


第二个 const 关键字:

位于函数声明的末尾,表示该成员函数是一个常量成员函数。
这意味着在常量对象上调用该函数时,该函数不会修改对象的任何非 mutable 成员。
在常量对象上调用非常量成员函数会导致编译错误,而常量成员函数可以在常量对象上调用。

二者的区别

效率比较:

在参数传递方面,第二段代码的 setMName 函数使用常量引用传递参数,避免了复制操作,因此效率更高。
在返回值方面,第一段代码的 getMName 函数返回私有成员变量的副本,而第二段代码的 getMName 函数返回常量引用,避免了副本的构造和销毁,因此第二段代码的效率更高。


内存比较:

第一段代码在 setMName 函数中使用了按值传递,会进行一次参数的复制操作,可能占用更多的内存。
第二段代码使用了常量引用传递参数,避免了复制,因此在内存使用上更加高效。
在返回值方面,第一段代码返回私有成员变量的副本,而第二段代码返回常量引用,不会产生额外的副本,因此第二段代码在内存使用上更加高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值