浅析C++的类--3

上回讨论了类的构造和析构函数,这会我们来讨论类的其他基本特性

this指针

我们一直在讨论单一对象,但是很多时候我们操作的并不只是单一对象,比如下面一个例子

假设我们在原本的Student类中添加一个函数,比较两个学生的goal值的大小,并返回最大的那一个

#include<iostream>
 
class Student
{
	int scr;
	int goal;
 
public:
void set(int a,int b){
	scr = a;
	goal =b;
}  
 
void show(){
	std::cout<< scr <<"\n"<< goal;
}
Student & compare(Student & s){
    if(s.goal > goal)
        return s;
    else
        return ???;
}
 
};
 
int main(){
	
Student abc;
abc.set(40,60);
abc.show(); 
 
return 0;
}
 
​

我们在Student类中添加了一个compare函数,它接受一个Student对象引用,并且返回一个Student对象引用 ,我们来梳理一下逻辑链

if语句判断传入的对象的goal值和本对象的goal值的大小,返回较大的值,如果传入的值大于本对象的值,则返回传入的对象,那如果是本对象的值较大呢?

那返回什么呢?return ???

我们发现,这时我们需要返回本对象,但是我们缺乏表示本对象的能力

怎么办呢?我们就需要this指针了

this指针指向调用成员函数的对象,也就是指向本对象

一般来说,所有的类方法都将this指针设置为掉用它对象的地址,比如,show()中的src只不过是this->src

所以,我们只要返回*this(*即作为解除引用运算符),return*this就可以了

类和结构

如果有稍微了解C++,那么看到这里会觉得有些熟悉,怎么和结构这么像!?

是的,没错,其实结构和类没有什么太大的不同,但是结构中的数据结构默认为public,但是类中的默认为private

对象数组

我们知道类是一种由用户定义的数据结构,通常我们可以声明一个个独立的对象,那么我们是否可以声明一个对象的集合呢?

当然可以!

Student complex[4];
complex[0].show();
complex[1].show();

对于complex[n]都是Student对象,都可以操作公有成员函数

那么怎么对其进行初始化?我们可以使用非默认构造函数进行显性构造

Student complex[4] = {
    Student(40,60);
    Student(50,70);
}

但是这里有一个很奇妙的点,我们并不需要对对象数组中的每一个对象进行显性构造,我们可以只构造一部分,剩下的元素将使用默认构造函数进行隐性构造

类的作用域

类的数据成员和类成员函数的作用域有且仅在整个类当中,所以,除了类声明和成员函数定义时,可以直接使用类名,其他时候,都需要对对象使用直接成员运算符(.),间接成员运算符(->),或者作用域解析符

Student abc; //allowed
Student *abcd= new Student;

void Student::Student(){

}    //allowed

Student.show(); //unallowed
abc.show();   //allowed
abcd ->show();   //allowed

和函数类似,在函数的定义域中,我们可以利用局部变量来做很多事

int compare(int a,int b){
    if (a>b)
        return a;
    else
        return b;
}

compare(3,4)

像a和b就是一个局部变量,在调用函数时把3和4赋值给a和b,再比较大小

class dog
{
int number = 10;
double dogs{number};
}

那这样的代码是否行的通呢?

很遗憾,这并不行,因为在利用类创建对象前,没有用于储存值的空间,第二行代码中,编译器并不知道什么是number和它的值

那怎么办呢?我们可以在类中创建一个常量,位于类的作用域,很显然,是不能用C的宏命令#define的,但其实,即使可以用,也最好不要依赖C++里的C实现,这一般会使得代码很不规范,我们可以利用static创建常量,或者利用枚举创建符号常量,但即使是这样,对于编译器,其中的number仍然会被解释称数字10

class dog
{
static int number = 10;
double dogs{number};
}
class dog
{
enum{number = 10};
double dogs{number};
}

而number作为一个常量,会和其他静态存储对象放在一起,而不在类和对象里

尾声

感谢观看!下一期会继续讨论类的特性!

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c variant是一种数据类型,它类似于Qt的QVariant类和Boost的any类。它可以将常见的数据类型封装在一个类中,以便在使用容器如std::vector时,能够存储不同类型的数据。引用中的例子展示了如何使用c variant,通过将不同类型的数据添加到std::vector<Variant>中来实现。例如,可以向vec中添加整数、字符串、布尔值和浮点数。这使得我们能够在一个容器中存储和处理不同类型的数据。 引用提供了一个简单的测试程序,展示了如何使用c variant。该程序包含了对Variant类的引用,并演示了如何创建一个std::vector<Variant>并添加不同类型的数据。然后,通过循环遍历vec中的元素并调用toString()函数,将每个元素打印到控制台。最后,使用system("pause")等待用户按下任意键结束程序。 总之,c variant是一种用于封装不同类型数据的数据类型,它可以方便地处理和存储各种类型的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++ 实现Variant类](https://blog.csdn.net/WU9797/article/details/96768653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [浅析C++中boost.variant的几种访问方法](https://download.csdn.net/download/weixin_38622475/12791752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值