C++面向对象程序设计 - 访问对象中成员的3种方法

        在C++程序中访问对象的成员变量和成员函数,有三种方法:

  1. 通过对象名和成员运算符访问对象中的成员;
  2. 通过指向对象的指针访问对象中的成员;
  3. 通过对象的引用变量访问对象中的成员

        在了解访问对象中成员的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、三种方法区别

        语法:对象实例和引用变量都是使用点"."运算符,指针对象对象使用"->"运算符。

        灵活性:指针对象提供了更多的动态性和灵活性,可以使用动态内存分配和复杂的数据结构。引用变量则更侧重于提供对象的别名,避免不必要的复制。

        安全性:使用指针时需要格外小心,因为不正确的使用可能导致内存泄露,野指针等问题。

        用途:对象实例通常用于简单的局部变量或对象创建。指针对象常用于动态内存管理、数组、键表等复杂数据结构。引用变量常用于函数参数和返回值,以提高效果。

  • 22
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值