C++动态创建类的对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++动态创建类的对象相关的知识,希望对你有一定的参考价值。

比如:
num表示对象的个数,对于一个A类,A *x=new A[num],输入num个对象,然后给每个对象从键盘输入一些值(姓名,学号,年龄)。
如果用构造函数:
A::A(char *a, char *b, int c)

strcpy(Name,a);
strcpy(ID,b);
Age=d;

该如何传递输入的值;
或者重新写个输入函数:
void A::enter(char *a, int b, int c)

strcpy(Name,a);
strcpy(ID,b);
Age=d;

又该如何传递输入的值。
本人在这方面不怎么懂,希望能得到哪位高手好人的细心讲解,谢谢。

代码未做编译。估计存在一些小问题。请自行修改

class A

public:
A()


A(char *a, char *b, int c)

strcpy(Name,a);
strcpy(ID,b);
Age=d;

void enter(char *a, int b, int c)

strcpy(Name,a);
strcpy(ID,b);
Age=d;

private:
char Name[32];
char Id[32];
int Age;
;
int const num =8;
int main()

A *x = new A[num];//这里必须调用默认构造函数。
for(int i = 0;i<num;i++)

char a[32] = 0;
char b[32] = 0;
int d = 0;
cout << "输入用户姓名 学号 年龄" <<endl;
cin >> a >> b >> d;
(x+i)->enter(a,b,d);//调用成员数赋值成员变量。
/*
调用复制构造函数。
A temp (a,b,d);
*(x+i) = temp;
*/

参考技术A #include <iostream>
using namespace std;
class A

public:
A()


void enter(char *a, char *b, int c)

strcpy(Name,a);
strcpy(Id,b);
Age=c;

void print()

fprintf(stdout,"%s %s %d\\n",Name,Id,Age);

private:
char Name[32];
char Id[32];
int Age;
;
int main()

int num = 0;
cout << "输入学生人数" <<endl;
cin >>num;//用回车结束输入
A *x = new A[num];
cout << sizeof(x) <<endl;
for(int i = 0;i<num;i++)

char a[32] = 0;
char b[32] = 0;
int d = 0;
cout << "输入用户姓名 学号 年龄" <<endl;
cin >> a >> b >> d;//输入时需要用空格分开,用回车结束输入
(x+i)->enter(a,b,d);

参考技术B youxietaiwenluan

C++类的定义和创建

类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例instance,拥有类的成员变量和成员函数。

类的成员变量称为类的属性(Property),将类的成员函数称为类的方法(Method)。在面向对象的编程语言中,经常把函数(Function)称为方法(Method)。

定义一个简单的类:

class Student{

public:
      //成员变量
      char *name;
      int age;
      float score;

      //定义类方法
      void speak(){
      cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;

      }


};

注意:类定义的最后有一个分号;,它是类定义的一部分,表示类定义结束了,不能省略。

类的创建:

class Student LiLei;  //正确
Student LiLei;  //同样正确

可以省略掉class。

还可以创建对象数组:Student allsu[100];

类成员的访问:

创建对象以后,可以使用点号.来访问成员变量和成员函数,这和通过结构体变量来访问它的成员类似

#include <iostream>
using namespace std;

//类通常定义在函数外面
class Student{
public:
    //类包含的变量
    char *name;
    int age;
    float score;
    //类包含的函数
    void say(){
        cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
    }
};

int main(){
    //创建对象
    Student stu;
    stu.name = "小明";
    stu.age = 15;
    stu.score = 92.5f;
    stu.say();

    return 0;
}

使用对象指针:

上面代码中创建的对象 stu 在栈上分配内存,需要使用&获取它的地址

Student stu;
Student *pStu = &stu;


pStu 是一个指针,它指向 Student 类型的数据,也就是通过 Student 创建出来的对象。

也可以在堆上创建对象,这个时候就需要使用前面讲到的new关键字

Student *pStu = new Student;

栈(Stack)和堆(Heap)是 C/C++ 程序员必须要了解的两个概念

在栈里面创建的对象,不必须要指针,因为创建之后就会有个对象名字,但是通过new创建的对象,堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。

对象指针后,可以通过箭头->来访问对象的成员变量和成员函数,这和通过结构体指正来访问它的成员类似

 

栈内存是程序自动管理的,不能使用 delete 删除在栈上创建的对象;堆内存由程序员管理,对象使用完毕后可以通过 delete 删除。在实际开发中,new 和 delete 往往成对出现,以保证及时删除不再使用的对象,防止无用内存堆积。

pStu -> name = "小明";
pStu -> age = 15;
pStu -> score = 92.5f;
pStu -> say();

小例子: 

#include <iostream>
using namespace std;

class Student{
public:
    char *name;
    int age;
    float score;

    void say(){
        cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
    }
};

int main(){
    Student *pStu = new Student;
    pStu -> name = "小明";
    pStu -> age = 15;
    pStu -> score = 92.5f;
    pStu -> say();
    delete pStu;  //删除对象

    return 0;
}

虽然在一般的程序中无视垃圾内存影响不大,但记得 delete 掉不再使用的对象依然是一种良好的编程习惯。

 

以上是关于C++动态创建类的对象的主要内容,如果未能解决你的问题,请参考以下文章

C++中为啥要动态创建对象,有啥好处

C++ 创建对象的动态数组?

在 C++ 运行时动态创建类对象

在 C++ 中的类中创建类对象的动态数组

如何取回类的动态创建的对象?

在C++ 如何在堆中创建一个类的对象? 谢谢!