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