在C++程序中访问对象的成员变量和成员函数,有三种方法:
- 通过对象名和成员运算符访问对象中的成员;
- 通过指向对象的指针访问对象中的成员;
- 通过对象的引用变量访问对象中的成员
在了解访问对象中成员的3种方法前,先了解下C++面向对象程序设计的特点。
1、struct和class区别
C++增加了class类型后,扔保留了结构体类型(struct),而且把它的功能也扩展了。c++允许用struct业定义一个“类”类型。如果struct类体内没用private和public对其成员作显式声明,系统将全部成员默认为public(公用的),外界可以任意引用其中的数据成员和成员函数。代码如下:
#include <iostream>
#include <string>
using namespace std;
struct Student{
int age;
string name;
string sex;
// 显示学员信息
void display(){
cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex;
}
};
int main(){
Student s;
s.age = 20;
s.name = "Jack";
s.sex = "male";
s.display();
}
运行结果如下:
如果class类体内没有private和public对其成员作显示声明,系统将全部成员默认为private(私有的),外界不可以任意引用其中的数据成员和成员函数。
所以如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用class。
2、类外定义成员函数
在C++中,成员函数可以在类体内定义,也可以在类体外进行函数定义。在类体内定义函数时,不需要在函数名前加上类名,因为函数属于哪个类已不言而喻。但成员函数在类外定义时,必须在函数名前添加上类名,予以限制,“::”两个冒号作为作用域限定符,用它声明函数是属于类中的函数。代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student{
private:
int age;
string name;
string sex;
public:
// 定义内置函数
inline void set_value(){
cin >>name >>age >>sex;
}
// 显示成员信息
void display(){
cout <<endl;
cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
}
string get_name();
};
int main(){
Student s;
s.set_value();
s.display();
string student_name = s.get_name();
cout <<"student name:" <<student_name <<endl;
}
string Student::get_name(){
return name;
}
3、inline成员函数
类的成员函数也可以指定为内置(inline)函数。C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student{
private:
int age;
string name;
string sex;
public:
// 定义内置函数
inline void set_value(){
cin >>name >>age >>sex;
}
// 显示成员信息
void display(){
cout <<endl;
cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
}
};
int main(){
Student s;
s.set_value();
s.display();
}
其实void display()也可以写成inline void display(),将display()函数显示地声明为内置函数。不写也是等效的,在类体内定义的函数,一般都省写inline。
但是如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明。代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student{
private:
int age;
string name;
string sex;
public:
// 定义内置函数
inline void set_value(){
cin >>name >>age >>sex;
}
// 显示成员信息
void display(){
cout <<endl;
cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
}
inline string get_name();
};
int main(){
Student s;
s.set_value();
s.display();
string student_name = s.get_name();
cout <<"student name:" <<student_name <<endl;
}
string Student::get_name(){
return name;
}
4、访问对象中的成员
在实际编程中,选择使用对象实例、指针对象还是引用变量,取决于你的具体需求和场景。
4.1、通过对象名访问成员
对象实例是直接创建的对象。可以直接使用点“.”运算符来访问它的成员(成员变量和成员函数)。代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student{
private:
int age;
string name;
string sex;
public:
// 定义内置函数
inline void set_value(){
cin >>name >>age >>sex;
}
// 显示成员信息
void display(){
cout <<endl;
cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
}
};
int main(){
Student s;
// 设置对象信息
s.set_value();
// 显示学员信息
s.display();
}
对象名和成员运算符访问对象中的成员,用点“.”(成员运算符)来对成员进行限定和调用,可以用"."调用对象中所有的公用成员。
4.2、通过对象的指针访问成员
指针对象是一个指向对象的指针。你需要使用"->"运算符来访问它所指向的对象的成员。指针提供了更多的灵活性,比如动态内存分配和对象数组的操作。但使用指针时,需要格外小心内存泄漏和野指针等问题。代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student{
private:
int age;
string name;
string sex;
public:
// 定义内置函数
inline void set_value(){
cin >>name >>age >>sex;
}
// 显示成员信息
void display(){
cout <<endl;
cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
}
};
int main(){
Student s, *p; //定义对象s和指向Student类的指针变量p
p = &s; // 使用p指向对象s
// 调用成员
p->set_value();
p->display();
}
4.3、通过对象的引用访问成员
引用变量是对象的别名。你可以像使用对象实例一样使用.运算符来访问它的成员。引用通常用于函数参数和返回值,以避免复制大型对象,提高效率。代码如下:
#include <iostream>
#include <string>
using namespace std;
class Student{
private:
int age;
string name;
string sex;
public:
// 定义内置函数
inline void set_value(){
cin >>name >>age >>sex;
}
// 显示成员信息
void display(){
cout <<endl;
cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;
}
};
int main(){
Student s; //定义对象s
// 引用变量s2指向对象s
Student &s2 = s;
// 调用成员
s2.set_value();
s2.display();
}
5、三种方法区别
语法:对象实例和引用变量都是使用点"."运算符,指针对象对象使用"->"运算符。
灵活性:指针对象提供了更多的动态性和灵活性,可以使用动态内存分配和复杂的数据结构。引用变量则更侧重于提供对象的别名,避免不必要的复制。
安全性:使用指针时需要格外小心,因为不正确的使用可能导致内存泄露,野指针等问题。
用途:对象实例通常用于简单的局部变量或对象创建。指针对象常用于动态内存管理、数组、键表等复杂数据结构。引用变量常用于函数参数和返回值,以提高效果。