unity c#啥时候会调用构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity c#啥时候会调用构造函数相关的知识,希望对你有一定的参考价值。

参考技术A 在unity中
继承monobehaviour类的C#脚本会在所挂载脚本的物体创建时由unity自己调用构造函数,不要自己在代码中调用它。
至于其他的非继承monobehaviour的类来说,你可以根据自己需要来手动的调用这些类的构造函数来创建他们的实例

强制转换啥时候调用新类型的构造函数?

【中文标题】强制转换啥时候调用新类型的构造函数?【英文标题】:When do casts call the constructor of the new type?强制转换什么时候调用新类型的构造函数? 【发布时间】:2011-06-07 05:36:24 【问题描述】:

确定特定的 static_cast 是否会调用类的构造函数的规则是什么? c 风格/函数式风格转换怎么样?

【问题讨论】:

【参考方案1】:

每当创建一个新对象时,都会调用一个构造函数。 static_cast 总是会产生一个新的临时对象(但请参阅 James McNellis 的评论) 立即,或通过调用用户定义的转换。 (但在 为了返回所需类型的对象,用户定义 转换运算符必须调用构造函数。)

当目标是类类型时,C风格转换和函数风格 根据定义,带有单个参数的强制转换与 a static_cast。如果函数式风格转换有零个或多个 参数,那么它会立即调用构造函数;用户自定义 在这种情况下不考虑转换运算符。 (而且可以 质疑将其称为“类型转换”的选择。)

作为记录,用户定义的转换运算符可能是 叫:

class A

    int m_value;
public
    A( int initialValue ) : m_value( initialValue ) 
;

class B

    int m_value;
public:
    B( int initialValue ) : m_value( initialValue ) 
    operator A() const  return A( m_value ); 
;

void f( A const& arg );

B someB;
f( static_cast<A>( arg ) );

在这种特殊情况下,强制转换是不必要的,并且转换 将在其缺席时隐式生成。但在所有情况下:隐式 转换、static_cast、C 风格转换 ((A) someB) 或函数式 风格演员(A( someB )), B::operator A() 将被调用。)

【讨论】:

“A static_cast 总是产生一个新的临时对象”不正确。例如,给定类层次结构struct B ; struct D : B ;,以下static_cast 不会创建新对象:D d; B&amp; b(static_cast&lt;B&amp;&gt;(d));。目标类型为对象类型的任何static_cast 都将创建一个新对象。 @James 是的,我应该更准确。我在考虑类类型(因为问题涉及构造函数);事实上,规则很简单(所有类型转换都一样):如果结果是引用,则没有新对象;否则,有。 (根据标准,类型转换的结果是左值当且仅当转换为引用类型。) 有趣的是,它不会在 c 数据类型的情况下创建副本godbolt.org/z/A0zu-o @JamesMcNellis 你所说的对象类型是什么意思?如果我有两个具有共同基础的派生类,例如:struct A ;结构 D1 : A ;结构 D2 : A D2(const A&) ;然后D1&d1; static_cast (d1) 调用ctor【参考方案2】:

每当创建该类型的新实例时,都会调用该类类型的构造函数。如果强制转换创建了该类类型的新对象,则调用构造函数。重载决议确定在给定特定参数的情况下调用类类型的哪些构造函数。

如果static_cast的目标类型是类类型,它将创建一个目标类型的新对象。

const_castdynamic_castreinterpret_cast 永远不会创建新的类类型对象,因此永远不会调用构造函数。

由于 C 风格的转换总是执行 static_castconst_castreinterpret_cast 的某种组合,因此它会在 static_cast 创建新对象的相同情况下创建一个新对象。

【讨论】:

没错,但重要的是要说 它创建一个新实例(IIRC 函数样式转换总是这样做,而静态转换在超过 cv 限定时会这样做)。 当目标类型是类类型时,唯一一次创建新类类型对象是通过static_cast。我已经用这个细节更新了答案。 请注意,如果源类型具有到目标类型的转换运算符,则静态转换本身可能不会调用构造函数,但仍然会“调用构造函数”。转换运算符可能会调用一个,另外还有一个潜在的隐藏的返回值副本结构需要考虑。该副本只能在转换运算符确实直接或间接调用某个 ctor 的情况下被省略。【参考方案3】:

如果有合适的转换构造函数,该转换构造函数将被static_cast调用:

class Class 
public:
    Class( int ); //<< conversion constructor
;

int what = 0;
Class object = static_cast<Class>( what );

这同样适用于 C 风格的转换和“函数式”转换。

int what = 0;
Class object = (Class)what;

int what = 0;
Class object = Class( what );

【讨论】:

如果构造函数是显式的呢?我认为它仍然会被调用。 @Mankarse:是的,explicit 表示如果不指定类型就无法调用它。当您指定类型时,它将被调用。

以上是关于unity c#啥时候会调用构造函数的主要内容,如果未能解决你的问题,请参考以下文章

类的静态函数和类的构造函数有啥关系?

关于Unity中MonoBehaviour的构造函数

java中静态方法,静态变量,静态初始化器,构造函数,属性初始化都是啥时候调用的? 它们的先后顺序。

unity中的构造函数

C++11 中的“转换构造函数”发生了啥变化? [复制]

我们啥时候需要 C++ 中的私有构造函数?