C++中. 和 -> 的区分

. 与 -> 的区分

介绍

定义一个 struct 结构体

struct test{
    string name;
    int marks, classes, rank;
};

当定义一个数据变量时,如: test a; 如果我们要读取其中名为 rank 的成员,我们只需要运用 .运算符即可,代码如下:a.rank

但,如果定义一个指针变量时,如: test *p 这时,如果我们要读取其中名为 rank 的成员,运用 . 运算符就需要如下代码:(*p).rank 由于 程序猿们过于懒惰 代码不便于书写,我们就用 -> (一个减号和一个大于号)做了简化:p->rank

综上所述,.-> 均为访问“类类型结构体”(structclass 等类型的结构体)成员的运算符,区别在于 . 用来访问数据类型变量,-> 用来访问指针类型变量

总结

1、A->a 表示指向结构体类型 A 中的指针类型 a

2、A.a 表示指向结构体 A 中的数值类型 a

3、A->a 等效于 (A).a

完整代码

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

struct test{
	string name;
    int marks;
};

int main(){
	test a;
	a.name = "ZhangSan";
	a.marks = 50;
	
	test *p = &a;
	
	cout << "a:" << "\n" << a.name << " " << a.marks << "\n" << "\n";
	cout << "p:" << "\n" << p->name << " " << p->marks << "\n" << "\n";
	cout << "p:" << "\n" << (*p).name << " " << (*p).marks << "\n" << "\n";
	return 0;
}

运行结果如下:
在这里插入图片描述
输出使用 printf

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

struct test{
	string name;
    int marks;
};

int main(){
	test a;
	a.name = "ZhangSan";
	a.marks = 50;
	
	test *p = &a;
	
//	cout << "a:" << "\n" << a.name << " " << a.marks << "\n" << "\n";
//	cout << "p:" << "\n" << p->name << " " << p->marks << "\n" << "\n";
//	cout << "p:" << "\n" << (*p).name << " " << (*p).marks << "\n" << "\n";
	
	printf("a:\n%s %d\n\n", a.name.c_str(), a.marks);
	printf("a:\n%s %d\n\n", p->name.c_str(), p->marks);
	printf("a:\n%s %d\n\n", (*p).name.c_str(), (*p).marks);
	return 0;
}

如何使用 printf 输出 string 类型字符串

报错样例

注意:如果输出时代码为

printf("a:\n%s %d\n\n", a.name, a.marks);

会出现这种情况:
在这里插入图片描述

出错原因

因为 printf 是针对 c 语言的输出语句,仅针对 c 语言内置数据类型,而 string 不属于 c 语言内置数据类型,因此编译器无法编译该语句

解决方法

输出 string 类型的字符串,可以使用 string 的函数 c_str() ,返回字符串的首字符的地址来输出整个字符串:

printf("a:\n%s %d\n\n", a.name.c_str(), a.marks);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
编写程序声明一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车 (motorcar)类。从bicycle和motorcar派生出摩托车(motorcycle)类。他们都有Run、Stop等成员函数。在main( )函数声明vehicle、bicycle、motorcar、motorcycle的对象,分别调用其Run( )、Stop( )函数,观察其执行情况。再分别用vehicle类型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop声明为虚函数,再试试看。观察虚函数的作用。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬ 输入 输出 vehicle is running... vehicle is stopped... bicycle is running... bicycle is stopped... motorcar is running... motorcar is stopped... motorcycle is running... motorcycle is stopped... --------------------------------------- vehicle is running... vehicle is stopped... bicycle is running... bicycle is stopped... motorcar is running... motorcar is stopped... motorcycle is running... motorcycle is stopped... #include <iostream> using namespace std; class vehicle { ...... }; class bicycle...... { ...... }; class motorcar..... { ....... }; class motorcycle....... { ...... }; int main() { vehicle v,*pv; bicycle by; motorcar mc; motorcycle mcy; //此处通过对象名来调用各成员函数 ......... cout<<"---------------------------------------\n"; pv=&v; pv->Run(); pv->Stop(); ........ pv->Run(); pv->Stop(); ....... pv->Run(); pv->Stop(); ....... pv->Run(); pv->Stop(); return 0; }
05-31

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值