同一个MFC工程中的两个普通类,为啥一个构造函数打点有反应,一个构造函数打点没反应?是因为设置问题吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同一个MFC工程中的两个普通类,为啥一个构造函数打点有反应,一个构造函数打点没反应?是因为设置问题吗相关的知识,希望对你有一定的参考价值。
你说的打点就是设置断点吧??第一、你要明白什么情况下才会打点有反应?
在执行的代码上打点才会有反应,也就是说程序运行的过程中要执行该行代码。
第二、什么情况下才会执行构造函数?
在你定义一个类的时候,在内存中要生成一个类的时候,才会执行他的构造函数。
这下你明白了吧?
因为你没有用到另一个类,所以没有调用它的构造函数,所以,你打点就没有反应。
如果还有问题的话,可以HI我。 参考技术A 发代码吧,否则不清楚问题在哪?
class 中的 Constructor():为啥需要它?
【中文标题】class 中的 Constructor():为啥需要它?【英文标题】:Constructor() in class: why is it needed?class 中的 Constructor():为什么需要它? 【发布时间】:2021-09-17 13:12:55 【问题描述】:基本问题:为什么类中需要构造函数?
下面是一个简单的测试:
带有构造函数的圆类 没有构造函数的 Circle2 类。 ... 但是,这两个类都可以工作并且可以创建一个实例。回到正题,为什么类中需要构造函数?
class Circle
draw()
console.log('hello');
c = new Circle(1);
class Circle2
constructor(radius)
this.radius = radius;
draw()
console.log('hello');
c2 = new Circle2(1);
【问题讨论】:
您的第一个Circle
没有半径。这似乎是添加构造函数的好理由。
从技术上讲,您的示例可以正常工作,但现在尝试为这两个类添加“calcArea()”函数。您只能使用 Circle2 这样做,因为您永远不会将半径存储在 Circle1 中。
Why do we need a constructor in OOP?
总是有一个默认构造函数,它本质上等同于基类中的constructor()
和派生类中的constructor() super();
。你不需要构造函数,但是如果你要为你的类提供参数,你将如何在没有构造函数的情况下接受它们?
感谢大家的观点。 link 很有启发性
【参考方案1】:
如果你做c.radius
,它还没有被定义,但是c2.radius
会是
当你没有构造函数时,你的类将接受参数但不会对它们做任何事情
【讨论】:
感谢您的观点。它沉入其中,您的回答帮助我掌握了它【参考方案2】:当没有声明constructor
时,new
运算符只会创建一个以Circle.prototype
为原型的空对象。如果你想初始化类实例的一些属性,那么你需要一个constructor
。
您还有另一种选择,如果您要创建的属性不依赖于构造函数参数,那么您可以使用class fields 作为等效项:
class Foo
// this is equivalent to a constructor initialization but it only takes a static assignment
bar = 'bar';
Class fields 在类实例上添加属性,就像 constructor
一样。
【讨论】:
谢谢 Guerric,我很欣赏这个答案的深度。由此我了解到需要constructor
,以便每个实例都有唯一的成员。如果我不需要唯一参数,我可以将constructor
排除在外。 (在这种情况下,一个函数或 const 可能就足够了!)如果这是在吠叫错误的概念?
是的,简而言之:如果你需要依赖于构造函数参数的类成员,那么你显然需要一个构造函数。如果您需要静态分配的类成员,您可以使用类字段(它们仍然限定在类 instance 范围内,并且可以像任何其他类成员一样在以后重新分配)。然后将类方法分配给原型并在所有实例之间共享。以上是关于同一个MFC工程中的两个普通类,为啥一个构造函数打点有反应,一个构造函数打点没反应?是因为设置问题吗的主要内容,如果未能解决你的问题,请参考以下文章
MFC中CDialog 的OnKeyDown()为啥不好使?
Java中的初始化顺序(静态成员静态初始化块,普通成员普通初始化块构造函数)