草庐IT

c++ - 对象与实例的区别 : C++

coder 2024-02-06 原文

我关注了一些关于 SO 的帖子,最后我可以得出一个结论,当我们
有类似的东西:

Person name;
name是类 person 的对象.

它在实例化时成为实例:
name=new Person();

我是 C++ 的初学者,到目前为止我已经看到我们可以访问如下函数和变量:
Person name;
name.getValue;
name.callFunction();

我们不需要使用 new运营商为此。那么我们可以说在 C++ 中可以忽略对象和实例之间的区分因素吗?

最佳答案

在 C++ 中,“对象”和“实例”几乎可以互换使用。

有一个通用的编程设计模式 classinstanceclass 保存了 instance 中所有 class 的信息。

在 C++ 中,当您声明 classstruct 时,编译器会生成描述如何创建 instanceclass 的代码,数据布局是什么,并提供一些可用于与该 079 交互的方法,包括销毁(包括销毁) )。
instance 方法和继承看似将一些方法和布局移动到实例:但数量非常有限。相反,每个实例都持有指向 virtual 类数据的指针。在某些语言中,您可以执行诸如在运行时替换实例的单个方法之类的操作:但在 C++ 中则不能。

当您创建 virtualclass 的实例时,它可以通过堆栈上的自动命名变量(如 struct )、匿名自动命名变量(如 Foo f; )、免费存储上的实例(如 0x145)或通过放置 - some_function( Foo(17,22) )(这是 new Foo(17, 22)new 创建实例的方式)。

令人困惑的是,C++ 中有一个单独的并行 std::vector - std::make_shared 模式 -- class - instanceclass templateclass ,实例化是实例。 class template 参数和特化指示如何在编译时“构造” class es。 template 上的模式匹配提供了有限数量的与实例无关的属性(模式中的“类属性”)。 (可以说函数模板函数是该模式的另一个实例)。

如果您查看 C++1y proposal for concepts lite,您将看到对象和实例在 C++ 中的含义可能不同。

int x = 0;
int& foo = x;
int* bar = &x;
class 既是对象又是 class template 类型的实例。
xint 类型的实例,但将 foo 称为对象可能是错误的!它是一个引用——一个别名,或某个对象的不同名称(在本例中为 int& )。
foo 是指向 x 的指针,它是 bar 类型的实例,将其称为对象可能是正确的。

这是一个有用的区别:如果类型是引用类型,则它不必表示对象类型。对象类型在许多重要方面的行为与引用类型不同。

现在,某些类型具有“引用语义”,因为它们在许多方面的行为都类似于引用,但实际上是 int es。这种类型的实例是更好地称为引用还是对象?在可怕的情况下,一些实例混合了引用和对象语义:这通常是一个不好的迹象。

通过 3.9 [Types] 中的 latest standard,我们获得了 C++ 中的类型。它们描述了什么是对象类型:

Types describe objects (1.8), references (8.3.2), or functions (8.3.5)





An object type is a (possibly cv-qualified) type that is not a function type, not a reference type, and not a void type.



因此,将函数类型或引用类型的事物的“实例”称为“对象”似乎是不正确的。请注意,访问函数或引用实例的“表示”基本上是不可能的:将别名引用到它们所引用的对象中,并且使用函数的名称会逐渐衰减为指向函数的指针(和指向函数的指针基本上是不透明的句柄,可让您调用它们)。

所以可以说函数不是实例,引用也不是实例。

另一方面,我们确实讨论了 int* class s 和函数 class s 的实例化。 14.7 是“模板实例化和特化”,实例化点(template 的)都是标准中的正式术语。

关于c++ - 对象与实例的区别 : C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22206044/

有关c++ - 对象与实例的区别 : C++的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  5. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  10. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

随机推荐