同一个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工程中的两个普通类,为啥一个构造函数打点有反应,一个构造函数打点没反应?是因为设置问题吗的主要内容,如果未能解决你的问题,请参考以下文章

C++/MFC多重继承调用基类构造函数

使用MFC中的AfxBeginThread创建多线程

MFC中CDialog 的OnKeyDown()为啥不好使?

Java中的初始化顺序(静态成员静态初始化块,普通成员普通初始化块构造函数)

Java 中的继承——创建子类的对象也会调用超类的构造函数。为啥?

golang函数中的参数为啥不支持默认值