实例化类对象是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实例化类对象是啥意思?相关的知识,希望对你有一定的参考价值。

把一个类,形象化,通过类的实例,就是对象,来实现类的功能。因为类是抽象的,所以需要实例化对象才能使用类。

类student是person的子类,所以从数据结构关系上讲,student不但拥有person即父类的一切特性还有着自身特有的属性。而在存储区域上student的分布则是区域的开始部分是父person类的所有数据,然后是student类自身的特有属性。所以他们的关系就是子类的数据是在父类的数据后面加上了一些自己的特性。

既然如此那么当我们使用子类实例化一个对象子后,那么这个对象同样也拥有了父类的所有特性,所以这时如果我们将这个子类的对象进行类型转化为父类的对象是完全可以的,因为子类的对象拥有父类的一切特性。

而Person p = new Student()这个语句其实就相当于隐式声明了一个子类对象然后将其隐式转化为父类的类型。所以这里的p应该是父类person的对象。这样做的好处是比如你声明了一个接口或者抽象类,然后要使用他的实例化对象,但是抽象类是不能直接实例化的,所以就需要靠子类来帮忙了。

参考技术A class void 正常人
形状 手=(描述手的形状);
形状 脚 =(描述脚的形状);
形状 头=(描述头的形状);
public 数量 手的数量=2;
public static 数量 脚的数量=2;//这句话里面多了一个static ,和上句有着相同点和不同点。看下文。
行为 走路;
行为 吃饭;
.....
....


class void 超人 extends 正常人
行为 飞行;
...
...


这个正常人就是一个类,用于描述人的特征,所有特征。但它只是一个概念,并不是实实在在的具体的某个人。
var 正常人 黄三= new 正常人();//对人进行实例化,黄三就是人的一个实例。黄三具有正常人的特征和一切符合正常人的行为。是指的实实在在的某个人。
var 正常人 李四=new 正常人();
var 蜘蛛侠=new 超人();对超人进行实例化,蜘蛛侠就是超人的一个实例,它不仅具有正常人的特征及行为,还具有正常人所没有的特征行为。
此时,你可以控制黄三、李四或者蜘蛛侠。
黄三不幸的发生了车祸,这时我们可以通对引用黄三的手的数量来达到目的。黄三.手的数量=1;
不幸发生了大地震,全世界所有人的脚都只有一个人。我们可以修改脚的数量。 一是正常人.脚的数量=1。此时,不管是黄三,还是李四,还是超人,脚都只有一只了。以后生下来了孩子(实例话一个正常人)也只有一只脚;
二是,黄三.脚的数量=1;李四.脚的数量=1;如果还有张五,赵六。。。,你也得为一一赋值。但以后生下来的孩子(实例化一个正常人)还是有两只脚。
这就是类与实例引用的区别。当然啦,在这个程序代码里在,你可以单独修改黄三,李四或者超人的脚的数量,但是,你不能一下子使所有正常人的手都变成一只,除非为for循环。好玩反?
参考技术B 比如 房子 是一个类型
某一个房子 就是一个房子类的实例,门牌号就是该实例对象的引用。

创建一个类的例子
1 分配内存(房子建立的那个小区里)
2 取得该内存的地址,即引用(门牌号)

在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是啥?

【中文标题】在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是啥?【英文标题】:What is the best way to store and instantiate list of classes in C++ without using STL?在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是什么? 【发布时间】:2009-09-16 21:01:42 【问题描述】:

我有一个类似下面的代码:

class News 
public:
  virtual void get() = 0;


class Cnn : News 
  void get () ...


class Msnbc : News 
  void get () ...


class Bbc : News 
  void get () ...



main ()

 News * news = new Cnn;
 news->get ()

 News * news = new Msnbc;
 news->get ()

 News * news = new Bbc;
 news->get ()

除了创建每个子类之外,存储子类(Cnn、Msnbc ...)并迭代并从所有提要中获取新闻的最佳方法是什么(我不能在一会儿)

谢谢

【问题讨论】:

为什么不能使用 STL?这就像说你不能使用 C++ :( 作业? 不使用STL的原因是什么?你应该使用一个容器类——即使是本土的——来管理分配。 (RAII - ***.com/questions/712639/…)。如果这也不是一个选项,那就是new News *[] 代码在嵌入式设备上运行,使用STL时链接器产生错误。它必须与 IO 做一些事情。 STL 将为您编写的任何主要项目节省时间 - 除非您真的想为您的自定义链表类进行单元测试。 我知道 C++ 在嵌入式方面的痛苦——就像被弹回到 90 年代初期一样。尽管如此,我还是强烈建议您尝试解决 STL 问题 【参考方案1】:

如果您不能使用 STL,那么最好的办法是使用一组 News*。

News*[] GetAllNews( int& count ) 
  News*[] arr = new News*[3];
  count = 3;
  arr[0] = new Cnn();
  arr[1] = new Msnbc();
  arr[2] = new Bbc();
  return arr;


int count;
News*[] arr = GetAllNews(count);
for ( int i = 0; i < count; i++ ) 
  arr[i]->get();


// Now for the awkward cleanup
for ( int i = 0; i < count; i++ ) 
  delete arr[i];
  arr[i] = NULL;

delete[] arr;

【讨论】:

@hacker,你选择了更静态的解决方案,而我选择了更动态的解决方案。动态的必然更冗长。 @hacker:我会说 C++ 中的金徽章使 JaredPar 有资格成为该语言的非初学者。再说一次,他没有被点燃:P @hacker,你怎样才能拥有一个动态大小的数组(无 STL)并且不那么冗长?除非有一些模板疯狂。 dribeas,c++ 中的金色徽章意味着他得到了人们的支持,他们从我的话中推断出他该语言的初学者。所以,徽章根本没有任何意义——另一方面,Jared 让你和你的两个支持者支持防守者并不是 Jared 的错 ;-) 而且我不知道“litb”是什么。尽管我不是语言的初学者,但英语不是我的母语,也永远不会是;-) @JaredPar:我在这里可以看到没有什么冗长的,但我认为你的数组声明有点不对劲——应该是News* arr[]而不是News*[] arr,返回类型为GetAllNews()需要进行类似的更改。【参考方案2】:
News *n[] =  new Cnn(), new Msnbc(), new Bbc() ;
for(News **p=n;p<&n[ sizeof(n)/sizeof(*n) ];++p) 
    (*p)->get();
    delete *p;

【讨论】:

为什么投反对票?它可能简洁的答案,但它回答了这个问题。静态方法也有效,尤其是在不能使用完整 C++ 的小型嵌入式系统中。 来吧伙计们,这是一个很好的答案——简洁而正确。 +1。 (为了清楚起见,将sizeof element-count 技巧拆分为单独的内联函数模板会很好。) 谢谢大家。 j_random_hacker,是的,在现实生活中的代码中是有意义的,但在答案中,我认为它可以更好地了解正在发生的事情。至少这是我将其嵌入此处的动机。 stefaanv,我实际上不知道在此处的代码中添加什么 - 它太短了,不需要不重复代码本身的 cmets。至于静态方法,在这种特殊情况下我认为没有任何理由比它更喜欢动态方法。它更快(当然,不多),更容易维护,更短......

以上是关于实例化类对象是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 STL 的情况下,在 C++ 中存储和实例化类列表的最佳方法是啥?

java中实例化方法是啥意思

创建java类并实例化类对象

PHP面相对象:声明类和实例化类

JAVA的“一个类只能要求有一个实例化对象”是啥意思

实例化类对象中alloc和inti的区别