C++对象数组「建议收藏」

C++对象数组「建议收藏」C++对象数组一、对象数组1.C++对象数组的定义:类名数组名[元素个数]例:Studentstu[10];2.对象数组访问形式:数组名[下标].成员名;例:stu[i].print();3.对象数组的初始化:对象数组的初始化通常也是由构造函数来完成的例:关于对象数组的几点说明:  (1)在建立对象数组的时候需要调用构造函数。如果对象数组有100个元素,就需…

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

C++对象数组

一、对象数组

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

例:Student stu[10];

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

例:stu[i].print();

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

例:

关于对象数组的几点说明:

  (1)在建立对象数组的时候需要调用构造函数。如果对象数组有100个元素,就需要调用100次构造函数。

  (2)如果对象数组所属类有带参数的构造函数时,可用初始化列表按顺序调用构造函数,使用复制初始化来初始化每个数组元素。

Student A[3]={Student(1,liu,1),Student(2,li,2),Student(3,he,3)};
Student A[3]={Student(1),Student(2),Student(3)};

(3)如果对象数组所属类有单个参数的构造函数时,定义数组时可以直接在初值列表中提供实参。

例:只有一个参数的构造函数给对象数组赋值。

#include<iostream>
using namespace std;
class exam{
	public:
		exam(int n){  //只有1个参数的构造函数 
			x=n;
		}
		int get_x(){
			return x;
		}
	private:
		int x;
};
int main(){
	exam ob1[4]={11,22,33,44};  //用只有1个参数的构造函数给对象数组赋值 
	for(int i=0;i<4;i++)
		cout<<ob1[i].get_x()<<" ";
	return 0;
}

C++对象数组「建议收藏」

当各个元素的初始值相同时,可以在类中定义不带参数的构造函数或者带有默认值的构造函数;当各个元素的的初始值要求不同时,需要定义带参数(无默认值)的构造函数。

例:用不到参数和带1个参数饿构造函数给对象数组进行赋值

#include <iostream>
using namespace std;
class Student{
    public:
        Student(){
            score=100;
    }
         Student(int n){
            score=n;
    }
         int get_score(){
            return score;
        }
    private:
        int score;
};
int main(){
    Student stu[4]={60,70,80,90};
    Student stu1[4]={60,70};
    Student stu2[4];
    for(int i=0;i<4;i++)
        cout<<stu[i].get_score()<<" ";
        cout<<endl;
    for(int i=0;i<4;i++)
        cout<<stu1[i].get_score()<<" ";
        cout<<endl;
    for(int i=0;i<4;i++)
        cout<<stu2[i].get_score()<<" ";
        cout<<endl;
    return 0;
}

C++对象数组「建议收藏」

二、构造函数拥有多个参数

如果构造函数有多个参数,在定义对象数组时只需在花括号中分别写出构造函数并指定实参即可实现初始化。

例3:用带有两个参数的构造函数给对象进行赋值

#include<iostream>
#include <cmath>
using namespace std;
class Complex{
    public:
        Complex(double r=0.0,double i=0.0):real(r),imag(i){
         
        }
        ~Complex(){
            cout<<"Destructor caller"<<endl;
        }
        double absComplex(){
            double t;
            t=real*real+image*imag;
            return sqrt(t);
        }
    private:
        double real;
        double imag;
};
int main(){
        Complex com[3]={   //定义对象数组
            Complex(1.1,2.2),  //调用构造函数,为第一个对象数组元素提供实参1.1和2.2
            Complex(3.3,4.4),
            Complex(5.5,6.6)
        };
        cout<<"复数1绝对值为:"<<com[0].absComplex()<<endl;
        cout<<"复数2绝对值为:"<<com[1].absComplex()<<endl;
        cout<<"复数3绝对值为:"<<com[2].absComplex()<<endl;
        return 0;    
}

C++对象数组「建议收藏」

对象数组中的元素同样需要用构造函数初始化。具体哪些元素用哪些构造函数初始化,取决于定义数组时的写法。

#include <iostream>
using namespace std;
class CSample{
    public:
        CSample(){
            cout<<"Constructor 1 Called"<<endl;
    }
        CSample(int n){
            cout<<"Constructor 2 Called"<<endl;
    }
};
int main(){
    CSample array1[2];
    cout<<"step1"<<endl;
    CSample array2[2]={4,5};
    cout<<"step2"<<endl;
    CSample array3[2]={3};
    cout<<"step3"<<endl;
    CSample* array4=new CSample[2];
    delete [] array4;
    return 0;
}

C++对象数组「建议收藏」

 array1 数组中的两个元素没有指明如何初始化,要用无参构造函数初始化,因此输出两行 Constructor 1 Called。

array2 数组进行了初始化,初始化列表 {4, 5} 可以看作用来初始化两个数组元素的参数,所以 array2[0] 以 4 为参数,调用构造函数 2 进行初始化;array2[1] 以 5 为参数,调用构造函数 2 进行初始化。这导致输出两行 Constructor 2 Called。

 array3 只指出了 array3[0] 的初始化方式,没有指出 array3[1] 的初始化方式,因此它们分别用构造函数 2 和构造函数 1 进行初始化。

动态分配了一个 CSample 数组,其中有两个元素,没有指出和参数有关的信息,因此这两个元素都用无参构造函数初始化。

在构造函数有多个参数时,数组的初始化列表中要显式包含对构造函数的调用。

class Student{
public:
    Student(int n){ }  //构造函数(1)
    Student(int n, int m){ }  //构造函数(2)
    Student(){ }  //构造函数(3)
};
int main(){
    //三个元素分别用构造函数(1)、(2)、(3) 初始化
    Student arrayl [3] = { 1, Student(1, 2) };
    //三个元素分别用构造函数(2)、(2)、(1)初始化
    Student array2[3] = { Student(2,3), Student(1,2), 1};
    //两个元素指向的对象分别用构造函数(1)、(2)初始化
    Student*  pArray[3] = { new Student(4) , new Student(1,2) };
    return 0;
}

pArray 数组是一个指针数组,其元素不是Student 类的对象,而是Student类的指针。Student*  pArray对 pArray[0] 和 pArray[1] 进行了初始化,把它们初始化为指向动态分配的Student对象的指针,而这两个动态分配出来的 Student对象又分别是用构造函数(1)和构造函数(2)初始化的。pArray[2] 没有初始化,其值是随机的,不知道指向哪里。Student*  pArray生成了两个Student对象,而不是三个,所以也只调用了两次 Student类的构造函数。

从栈区和堆区两种存储方式上看它的使用

#include <iostream>
using namespace std;
class Coordinate
{
public:
    Coordinate(){};//无参构造函数
	~Coordinate(){};//析构函数
public:
    int m_iX;
	int m_iY;
};
int main()
{
	Coordinate coor[3];
	coor[0].m_iX=1;
	coor[0].m_iY=2;
	coor[1].m_iX=3;
	coor[1].m_iY=4;
    coor[2].m_iX=5;
	coor[2].m_iY=6;//类似数组直接访问
	Coordinate *p=new Coordinate[3];
	p->m_iX=7;//默认访问首地址
    p[0].m_iY=8;//与上面一行指向的都是首地址
	p++;//指针往后指一个
	p->m_iX=9;
	p->m_iY=10;
	p++;//指针往后指一个
	p->m_iX=11;
	p->m_iY=12;
	p--;
	p--;
	for(int i=0;i<3;i++)
	{
		cout<<coor[i].m_iX<<" ";
     	cout<<coor[i].m_iY<<" ";
		cout<<"\n";
	}
	for(int j=0;j<3;j++)
	{
		cout<<p[j].m_iX<<" ";
        cout<<p[j].m_iY<<" ";
		cout<<"\n";//没有进行过p++的才能用这种方式,因为上面进行了三次p++,p此时指向的是最后一个
	}//为了规避这种情况我们利用指针回指打印数据
	delete []p;
	p=NULL;//注意如果用了p--指向第一个数据的话不能用delete,因为此时delete的不是我们申请的内存,
如果是这种情况使用p++指向到申请的内存在释放
	system("pause");
	return 0;
}

三、指向对象的指针

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

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158165.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VS2008序列号_苹果序列号过期什么意思

    VS2008序列号_苹果序列号过期什么意思转自:http://lanmaodream.blog.163.com/blog/static/212569007201291874945494/今天打开VS2008突然弹出图如下:为什么会出现上图这种情况呢?嘿嘿,咱使用的是试用版本哦!!!我的是Win7系统,其实各个系统都一样!不过在要输入序列号时,你会发现没有地方可以输入,这时你需要给VS2008打个补丁!!!打

    2022年8月10日
    3
  • Conda 替换镜像源方法尽头,再也不用到处搜镜像源地址[通俗易懂]

    Conda 替换镜像源方法尽头,再也不用到处搜镜像源地址[通俗易懂]文章目录conda替换镜像源教程1镜像源添加方法2如何找到你要用的源conda替换镜像源教程由于国内访问conda官网很慢,离线安装又费时费力,因此,替换国内源是一个极佳的办法。但是,目前国内源的替换教程过于老旧,都是2018-2021年的方法,尽管替换镜像源的方法不变,但是网上的资料中,很多镜像源都失效了,没有一个教程能够告诉大家如何去找自己的镜像源并添加进去。本教程出于此目的,保证大家以后添加的镜像源实效性强。(时间2022.3.10)1镜像源添加方法首先是一些常用命令,帮你诊断目前你的co

    2022年9月30日
    0
  • Sql学习笔记-declare用法

    Sql学习笔记-declare用法栗子一:IF 1=1BEGIN    DECLARE @test VARCHAR    SET @test=’1′       PRINT ‘in if:’+@testEND运行看结果输出inif:1这是可以预想的结果。那我们在if外面使用变量@test试试。栗子二:IF 1=1BEGIN   DECLARE @test VARCHAR   SET @test=’…

    2022年8月20日
    20
  • MySQL行转列函数[通俗易懂]

    MySQL行转列函数[通俗易懂]原文链接:http://www.360doc.com/content/18/0525/20/14808334_757019563.shtml概述好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下。问题链接:关于Mysql的分级输出问题情景简介学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据表里面数据如下图,使用姓名+课程作为联合主键(…

    2022年6月13日
    117
  • 十大经典排序算法(C语言实现)[通俗易懂]

    十大经典排序算法(C语言实现)[通俗易懂]原文链接:https://www.cnblogs.com/onepixel/articles/7674659.html1、冒泡排序(BubbleSort)冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经…

    2022年5月9日
    50
  • 2021pycharm激活码【最新永久激活】

    (2021pycharm激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS3…

    2022年3月26日
    118

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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