C++类和对象数组[通俗易懂]

C++类和对象数组[通俗易懂]C++类和对象数组【1】对象数组1:对象数组的定义:类名数组名[元素个数]Eg:studentasa[10];//有10个元素的学生类对象数组2:对象数组的访问形式:数组名[下标].成员名;Eg:asa[j].print();3:对象数组的初始化:对象数组的初始化通常也是由构造函数来完成的。Eg:#include”student.h”intmain{…

大家好,又见面了,我是你们的朋友全栈君。

C++类和对象数组

1】对象数组

1:对象数组的定义:类名 数组名[元素个数]

Eg: student asa[10];//10个元素的学生类对象数组

2:对象数组的访问形式:数组名[下标].成员名;

Eg: asa[j].print();

3:对象数组的初始化:对象数组的初始化通常也是由构造函数来完成的。

Eg: #include”student.h”

int main

{

student asa[4]={student1,“LiMing,98,student(2,”Bill”,89),student(3,”Chlily”,99),student(4,”Saraea”,96)};

for(int i=0;i<4;i++)

asa[i].print();

return 0;

}

2】指向对象的指针

1:对象指针的用法:定义对象指针的语法和定义其它基本数据类型指针的语法相同。在使用对象指针之前,要把它指向一个已经创建的对象,然后才能访问该对象的成员。在使用对象名来访问对象成员时,要使用点运算符“.。如果要通过指向对象的指针来访问对象的成员,那么必须使用箭头运算符“->

3this指针

    Eg: class student

{

    int number;

    char name[15];

    float score;

    void display()

{

    cout<<”number: ”<<number;

cout<<”name: <<name;

cout<<”score: <<score;<<endl;

}

};

1:在成员函数display()中有一个隐藏的指针作为参数,该指针参数使用关键字this命名,它是指向该类对象的指针,成员函数可以通过它来访问该类对象的数据成员。voiddisplay(student *this)//this指针由编译器自动生成。

2this指针是由C++编译器自动产生的一个隐含指针,编译器将该指针自动插入到类的所有成员函数的参数列表中,成员函数使用该指针来存取对象的数据成员。

3:内存中只有一份成员函数的备份,而且对象的实例变量和成员函数是分开存放的,egX const *this。当对象调用该函数时,编译器自动将该对象的地址作为实参传递给相应的成员函数的this指针。

Eg:void date::set(date* constthis,int d,int m,int y)

{

    this->day=d;

    this->month=m;

    this->year=y;

}

注意:this指针由编译器自动生成,程序员不能将this指针的说明写在函数中,否则将出现编译时间错误信息。

4this指针是系统的一个内部指针,通常以隐式方式使用,但也可以被程序员显式使用,例如,当运算符重载和建立双向链表时,显式使用this指针十分必要。

4】对象的赋值:如果两个对象属于同一种类类型,换句话说,两个对象是由同一个类声明的,那么我们可以将其中的一个对象的值(属性值)赋给另一个对象。默认情况下,当将一个对象赋值给另一个对象时,第一个对象的数据将被按位复制到第二个对象中。对象的赋值仅仅是使两个对象的值相等,而这两个对象仍然是相互独立的,即修改一个对象的值将不会影响到另一个对象。

Eg:Rectangle rect1(10,20),rect2(0,0);

    rect2=rect1;

5】对象作为函数参数:分类:传值调用,传址调用

    1:传值调用:传值调用,传送的是作为实际参数的对象的拷贝而不是实际对象的本身。因此在函数中改变对象的值不会影响作为实际参数对象本身。

    Class Square

{

        int side;

    public:

       void set(int x) {side=x;}

       void out() {cout<<side<<”\n”;}

};

void f(square x)

{

    x.out();

    x.set(100);

    x.out();

}

    int main()

{

    Square s;

    s.set(10);

    f(s);

    s.out();

return 0;

}  

    2:传址调用:当函数调用时传递的是作为实际参数的对象的地址,就是传址调用方式。在函数中对作为形式参数的对象的修改实际上就是对作为实际参数的对象的修改。我们既可以使用对象的引用来实现传址调用,也可以用指针来实现。

使用对象的引用来实现传址调用:

Class Square

{

        int side;

    public:

       void set(int x){side=x;}

       void out() {cout<<side<<”\n”;}

};

void f(square &x)//对象的引用作为函数的参数

{

    x.out();

    x.set(100);

    x.out();

}

    int main()

{

    Square s;

    s.set(10);

    f(s);

    s.out();

return 0;

}

使用指向对象的指针来实现传址调用的例子

Class Square

{

        int side;

    public:

       void set(int x){side=x;}

       void out() {cout<<side<<”\n”;}

};

void f(square *x)

{

    x.out();

    x.set(100);

    x.out();

}

    int main()

{

    Square s;

    s.set(10);

    f(&s);

    s.out();

return 0;

}

6】从函数返回对象:当函数返回对象时,函数创建了一个临时对象来保存要返回的值,而函数所返回的对象实际上是这个临时对象。在对象的值被返回之后,临时对象将被销毁。

    Eg:mystring input()

{

    char instr[80];

    mystring str;

   cin>>instr;

str.set(instr);

return str;//返回一个mystring对象

}

int main()

{

    Mystring ob;

    ob=.input();

    ob.print()

    return 0

}

7】类的静态成员

1:静态成员:C中通过在变量定义的前面加static关键字就可以将变量声明为静态变量。采用局部静态变量可以减少全局变量的使用:将全局变量声明为静态的可以降低全局变量的副作用。C++中通过在类的成员函数前面加上static关键字将其成员声明为静态成员,一个类的静态成员既可以是静态数据成员,也可以是静态成员函数。

  1. 静态数据成员

    声明类的静态数据成员的方式是在变量定义的前面加static关键字

    classstudent

    {

      private:

          int num;

          char *name;

          float score;

          static int count;

          static float sum;//类student的静态数据成员的声明

      public:

          ……

    };

    intstudent::count=0;

    floatstudent::sum=0; //静态成员变量应在创建类的对象前定义并进行初始化

    一个类的静态数据成员为该类的所有对象所共有,不管创造了这个类的多少个对象,其静态数据成员在内存中只有一份拷贝。由于只有一个类的静态成员只有一份拷贝,所以我们经常使用“类名::”来访问静态数据成员。例如:counter::count=0;

        静态成员变量的最一般的作用就是对一些共享资源提供存取控制。

    静态成员好处就是减少了全局变量的使用。

    静态成员主要作用就是定义类的各个对象所共用的数据,如统计总数,平均数等。

 2:静态成员函数:在类的成员函数前面加上static关键字说明的函数就是静态成员函数。只使用静态数据成员的函数可以定义为静态成员函数。对静态成员函数的引用使用所属的类名加作用域分辨运算符来限制,即“类名::”。

Eg: classStudent

{

    private:

       ……

    public:

static void init()

{

               Student::count=0;

              Student::sum=0;

}

Static float average();

};

float student::average()

{

    cout<<”sum is <<sum<<\tcount is <<count<<endl;

    cout<<”average is”<<sum/count<<endl;

    return sum/count;

}

静态成员函数可以在创建该类的任何成员之前处理静态数据成员,这是普通成员函数不能实现的。一般来说,类的静态成员函数是用来访问静态数据成员的,当然可以访问全局变量。静态成员函数不具有this指针。也就是说,静态成员函数不与某个具体的对象相联系,它只属于该类。

8】类的友元

1:友元函数:将关键字friend放在函数名的前面就将该函数说明为友元函数。一个类的友元函数是在该类中说明的一个非成员函数,但允许访问该类对象的所有成员。友元函数可以访问类的私有成员,节省了调用成员函数的开销,从而提高了程序的运行效率。如果需要一个函数同时访问多个类,则它可以定义为多个类的友元函数。1)使用友元破坏了封装性,降低了程序的可维护性。因此使用友元时要慎重的权衡得失后再决定。2)因为友元函数不是类的成员,故在友元函数中没有this指针,因此必须通过函数参数来传递对象。

2:友元类:若一个类为另一个类的友元,则次类的所有成员函数都能访问对方类的私有成员。下例所示:类B的所有成员函数都是类A的友元函数,都能够访问类A的所有成员。但是类A不是类B的友元类

Eg:class A

{

    ……

public:

    friend class B;

    ……

};

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158021.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 加密Excel解密

    加密Excel解密excel文件进行加密,能够保护excel文件的内容,但是有时候我们自己设置的密码,时间久了可能会忘记,或者在网上下载的excel文件或者同事之间转发的excel文件也有加密,这对于我们来说都不是很方便了。想要解密excel文件的加密,需要用到奥凯丰EXCEL解密大师excel加密有两种,它们的解密方法也是不一样的。激活成功教程打开密码,激活成功教程它的方法目前只有通过软件找到正确密码才能进行解密,所以点击进入【找回密码】,选择一种找回方法进行激活成功教程(如果对自己设置的密码还有一些印象,可以使用组合破击..

  • 免费下载的音乐的6个网站,非常实用的软件_什么网站下载音乐是免费的

    免费下载的音乐的6个网站,非常实用的软件_什么网站下载音乐是免费的MyFreeMP3网址:http://tool.liumingye.cn/music/?page=homePage从标准音质,到无损音乐皆可免费下载,并且提供从封面到歌词的一站式服务。最大的优点是:可以下载有版权限制的歌曲,比如周杰伦的《稻香》陈奕迅的《好久不见》推荐指数⭐⭐⭐⭐咪咕音乐网页版网址:http://music.migu.cn/v3基本上所有的歌曲都可以下载,标清版的可以免费下载,其他版本的需要收费。咪咕音乐算是歌曲比较全,而且免费…

    2022年10月12日
  • sftp上传本地文件_sftp连接超时原因

    sftp上传本地文件_sftp连接超时原因关键:(1)sftp的测试指令:sftp-oPort=2125meituan@220.248.104.170(2)让上海那边自己试了一下,也不行,他们自己重置了一下sftp的密码,我们可以登录了;上海那边反应,在10月10号早上,大量重复数据发送到上海政府端,查询后发现在:dx-qcs-regulation-shanghai06这个主机有问题:里面有大量的…

  • 日志管理ELK

    日志管理ELK运维架构日志管理ELK:ElasticSearch、Logstash和Kibana介绍,结合redis安装配置及展示更多干货分布式实战(干货)springcloud实战(干货)mybatis实战(干货)springboot实战(干货)React入门实战(干货)构建中小型互联网企业架构(干货)python学习(干货)ElasticSearch笔记一、 介绍1、日志主要包括系…

  • 数据仓库 数据集市_实时数仓应用场景

    数据仓库 数据集市_实时数仓应用场景#实时数仓项目-数据采集与ODS层配置canal实时采集mysql数据一、mysql开启binlog二、安装配置canal采集数据到kafka三、启动kafka消费者验证ODS层数据处理导入hbase一、flink采集kafka数据配置canal实时采集mysql数据一、mysql开启binlog修改mysql的配置文件(linux:/etc/my.cnf,Windows:\my.ini)log-bin=mysql-bin#开期binlogbinlog-format=ROW#选择ROW

  • 记一次不在状态的大疆面试

    记一次不在状态的大疆面试之前写博客也有不少,但一直没有一个固定的地方,csdn,博客园,eoe,oschina都写过一些,但没有长期固定的去记录,自己开的博客站也因为忘记续费而被停掉,数据也丢了…希望在简书能坚持记录一些技术上的东西,刚好昨天在大疆面试完,就以大疆作为简书博客的开端吧11月初有前同事内推大疆Android开发的机会,就发了一份简历过去试试。大概一个星期,收到了…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号