javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

构造函数-如何用C ++写一个简单的类?

我已经阅读了很多有关C ++类的教程,但是他们错过了其他教程包括的内容。

有人可以告诉我如何编写和使用一个非常简单的C ++类,该类使用可见性,方法以及简单的构造函数和析构函数吗?

trans by 2020-08-12T04:30:19Z

例外-在什么情况下不会调用C ++析构函数?

我知道我的析构函数是在正常的堆栈释放时以及引发异常时调用的,而不是在调用exit()时调用的。

在其他情况下,我的析构函数不会被调用吗? 诸如SIGINT或SIGSEGV之类的信号呢? 我假设对于SIGSEGV,它们没有被调用,但是对于SIGNINT,我怎么知道哪些信号将使堆栈退卷?

还有其他情况下将不会调用它们吗?

trans by 2020-08-09T18:05:40Z

结构-此C ++析构函数是否冗余?

我收到了一些定义如下的各种结构的C ++代码:

typedef struct _someStruct_ {
   std::string someString; 
   std::vector<std::string> someVectorOfStrings;
   int  someOtherStuff;

   ~_someStruct_()
   {
      someString.clear();
      someVectorOfStrings.clear(); 
   }
} someStruct; 

这里的析构函数是完全多余的吗-如果要通过默认的析构函数对结构进行破坏,则不会破坏任何字符串,向量等吗?

如果我编写了代码,就不会想到在这里添加显式析构函数-我只是让编译器继续使用它。

据我了解,您唯一需要在结构中创建自己的析构函数的情况是,结构的任何成员是否包含指向可能需要清除的数据的指针,或者是否具有某些其他功能(例如,用于调试, 需要删除一个结构)。

我是否在这里缺少任何内容-为何在析构函数中明确清除了字符串和向量? 我的怀疑是,发给我这封信的人实际上是一位C程序员(请参阅typedef),他试图将一些C代码转换为C ++。

trans by 2020-08-09T08:09:56Z

构造函数引发异常时,调用析构函数吗?

寻找C#和C ++的答案。 (在C#中,将'destructor'替换为'finalizer')

trans by 2020-08-05T08:42:17Z

跳转到块:析构函数是否被调用?

考虑以下代码:

void foo()
{
    {
        CSomeClass bar;

        // Some code here...

        goto label;

        // and here...
    }

label:
    // and here...
}

酒吧的破坏者会叫吗?

trans by 2020-07-30T05:52:20Z

析构函数-删除类之一时Qt中的信号是否自动断开连接

当一侧被删除时,Qt是否会自动删除对象之间的连接?

例如connect (A .. , B ..),当删除A(指针)或删除B时,连接会断开吗?

是否有必要在析构函数中显式使用断开连接?

trans by 2020-07-27T12:16:02Z

C ++-显式调用析构函数

我了解在大多数情况下,我们不应该显式调用析构函数。 但是,我从C ++ 11 Standard N3485第13.4.5节模板参数中看到了一个示例:

对具有以下类型的对象的显式析构函数调用 是专门用于类模板的类,可以显式指定 模板参数。 例:

placement delete

在我看来,在这种情况下,我们可以显式调用析构函数,您能向我解释为什么吗? 在此示例中,那些析构函数调用是什么意思? 为什么它们是合理的?

另一个问题:

除了在实现placement delete时,还可以在哪些情况下显式调用析构函数?

谢谢。

编辑:我从C ++常见问题解答中发现,我们不应该在局部变量上显式调用析构函数。

trans by 2020-07-21T11:41:53Z

析构函数的使用=删除;

考虑以下类别:

struct S { ~S() = delete; };

简短而又出于问题的目的:我无法创建S的实例,如S s{};889,因为我无法销毁它们。
如评论中所述,我仍然可以通过执行S *s = new S;创建实例,但是也无法删除它。
因此,我只能看到已删除的析构函数的用法如下:

struct S {
    ~S() = delete;
    static void f() { }
};

int main() {
    S::f();
}

也就是说,定义一个只公开一堆静态函数的类,并禁止尝试创建该类的实例。

删除的析构函数的其他用途(如果有)是什么?

trans by 2020-06-27T22:45:00Z

javascript-typeScript中是否有析构函数

TypeScript中有析构函数吗? 如果没有,如何删除对象?我尝试了destructor()~ClassName(),但是没有用。

trans by 2020-06-22T20:40:09Z

C ++-RAII与异常

我们在C ++中使用RAII的次数越多,我们发现自己进行非平凡释放的析构函数就越多。 现在,重新分配(最终确定,不过您要称呼它)可能会失败,在这种情况下,异常实际上是让楼上的所有人知道我们重新分配问题的唯一方法。 但是再说一次,抛出析构函数是一个坏主意,因为在堆栈展开期间可能会抛出异常。 std::uncaught_exception()可以让您知道何时发生,但不多,因此,除了让您在终止之前记录消息外,您无能为力,除非您愿意将程序保持在未定义状态,在此状态下,一些东西已被释放/ 最终确定,有些则没有。

一种方法是使用非抛出析构函数。 但是在许多情况下,这只是隐藏了一个真正的错误。 例如,由于抛出某些异常,我们的析构函数可能正在关闭某些RAII管理的数据库连接,而这些数据库连接可能无法关闭。 这并不一定意味着我们可以在此时终止程序。 另一方面,记录和跟踪这些错误并不是针对每种情况的解决方案。 否则,我们就不需要例外。使用无抛出析构函数,我们还发现自己必须创建“ reset()”函数,这些函数应该在销毁之前被调用-但这完全违反了RAII的全部目的。

另一种方法是让程序终止,因为这是您可以做的最可预测的事情。

有人建议链接异常,以便一次可以处理多个错误。 但老实说,我从来没有真正看到过用C ++做到这一点,而且我也不知道如何实现这样的事情。

所以它是RAII或例外。 是不是 我倾向于不丢球的破坏者。 主要是因为它使事情变得简单。 但是我真的希望有一个更好的解决方案,因为,正如我说的那样,我们使用RAII的次数越多,我们发现使用做不起眼的事情的dtor就会越多。

附录

我正在添加指向我发现的有趣的主题文章和讨论的链接:

  • 投掷破坏者
  • 关于SEH问题的StackOverflow讨论
  • StackOverflow关于引发析构函数的讨论(感谢Martin York)
  • 乔尔的例外
  • SEH被认为有害
  • CLR异常处理也涉及异常链接
  • 在std :: uncaught_exception上的Herb Sutter以及为什么它没有您想象的有用
  • 与有趣的参与者就此事进行历史讨论(很长!)
  • Stroustrup解释RAII
  • 安德烈·亚历山大(Andrei Alexandrescu)的瞄准镜
trans by 2020-06-16T23:01:46Z

从C ++中的析构函数中恢复对象?

免责声明:我知道这是一个糟糕的设计,我只是出于好奇而提出这个问题,以便尝试获得有关析构函数在C ++中如何工作的更深入的知识。

在C#中,可以写:2749286428323623611648在一个类的析构函数中(请参见下面的编辑),这意味着即使在析构函数调用完成之后,该对象仍将在内存中保持活动状态。

C ++的设计是否允许类似于上述C#算法从析构函数中恢复对象?

编辑:正如下面的回答所指出,GC.ReRegisterForFinalize()与该问题的关系比GC.KeepAlive(this)更紧密。

trans by 2020-02-15T23:05:59Z

在C ++中调用析构函数和构造函数的顺序是什么

在C ++中调用析构函数和构造函数的顺序是什么? 使用一些基类和派生类的示例

trans by 2020-02-14T16:45:23Z

构造函数-C ++默认构造函数

例如,当我不声明constructor时,编译器将为我提供default constructor,它没有参数也没有定义(正文),因此将不采取任何措施。

如果我现在不声明default constructor,则编译器将为我提供default destructor没有定义(body),因此,我认为不采取任何措施。

因此,例如,如果我完成了一个对象,那么default constructor不会重新分配该对象使用的(空闲)内存吗? 如果没有,我们为什么要得到它?

并且,也许相同的问题也适用于default constructor。如果它什么也不做,为什么默认情况下会为我们创建它?

谢谢。

trans by 2020-02-14T10:57:42Z

为什么我们需要使用虚拟〜A()= default; 而不是C ++ 11中的虚拟〜A(){}?

在Stack Overflow帖子中,检查C ++ 11中的对象类型,我有以下评论:

在C ++ 11中,您实际上将要执行virtual ~A() = default;否则,您将失去隐含的move构造函数。

virtual ~A() = default;是做什么用的? virtual ~A() {}为何隐式移动构造函数会丢失?

trans by 2020-02-08T19:13:24Z

析构函数可以递归吗?

这个程序定义明确吗?如果不正确,为什么呢?

#include <iostream>
#include <new>
struct X {
    int cnt;
    X (int i) : cnt(i) {}
    ~X() {  
            std::cout << "destructor called, cnt=" << cnt << std::endl;
            if ( cnt-- > 0 )
                this->X::~X(); // explicit recursive call to dtor
    }
};
int main()
{   
    char* buf = new char[sizeof(X)];
    X* p = new(buf) X(7);
    p->X::~X();  // explicit call to dtor
    delete[] buf;
}

我的推理:尽管两次调用析构函数是未定义的行为,但根据12.4 / 14,它的确切含义是:

如果行为是不确定的   为对象调用析构函数   生命已经结束

似乎并不禁止递归调用。 在执行对象的析构函数时,对象的生存期尚未结束,因此再次调用该析构函数不是UB。 另一方面,12.4 / 6表示:

执行尸体后   X类的析构函数调用   X的直接成员的析构函数,   X直接基地的破坏者   类[...]

这意味着在递归调用析构函数后,所有成员和基类析构函数都将被调用,而返回到先前的递归级别时再次调用它们将是UB。 因此,没有基础并且只有POD成员的类可以具有没有UB的递归析构函数。 我对吗?

trans by 2020-02-07T13:08:57Z

为什么没有在异常上调用析构函数?

我希望在该程序中调用cl /EHa my.cpp,但事实并非如此:

#include <iostream>

struct A {
  ~A() { std::cout << "~A()" << std::endl; }
};

void f() {
  A a;
  throw "spam";
}

int main() { f(); }

但是,如果我将最后一行更改为

int main() try { f(); } catch (...) { throw; }

然后调用cl /EHa my.cpp

我正在从Visual Studio 2005中使用“ Microsoft(R)32位C / C ++为80x86优化编译器版本14.00.50727.762版本”。命令行为cl /EHa my.cpp

编译器像往常一样正确吗? 标准对此事怎么说?

trans by 2020-02-03T14:42:26Z

析构函数-何时在PHP中不调用__destruct?

class MyDestructableClass {
   function __construct() {
       print "\nIn constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "\nDestroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();

当上面的脚本在复杂的环境中时,exit不会被调用exit,但是我无法轻松地重现它。有人注意到吗?

编辑

我将在此处发布整个内容,这是symfony的测试环境,这意味着如果您熟悉框架,则可以轻松地重现它:

require_once dirname(__FILE__).'/../bootstrap/Doctrine.php';


$profiler = new Doctrine_Connection_Profiler();

$conn = Doctrine_Manager::connection();
$conn->setListener($profiler);

$t = new lime_test(0, new lime_output_color());

class MyDestructableClass {
   function __construct() {
       print "\nIn constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "\nDestroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
$news = new News();

$news->setUrl('http://test');
$news->setHash('http://test');
$news->setTitle('http://test');
$news->setSummarize('http://test');
$news->setAccountId(1);
$news->setCategoryId(1);
$news->setThumbnail('http://test');
$news->setCreatedAt(date('Y-m-d H:i:s',time()));
$news->setUpdatedAt(date('Y-m-d H:i:s',time()));
$news->save();
exit();
trans by 2020-02-03T03:05:16Z

c-如何查询pthread是否仍在运行?

在我的析构函数中,我想干净地破坏线程。

我的目标是等待线程完成执行,然后销毁线程。

我发现有关查询pthread状态的唯一信息是pthread_attr_setdetachstate,但这只能告诉您线程是否为:

  • PTHREAD_CREATE_DETACHED
  • PTHREAD_CREATE_JOINABLE

两者都与线程是否仍在运行无关。

如何查询pthread是否仍在运行?

trans by 2020-02-02T21:05:01Z

C ++ 11-C ++局部变量销毁ord

在C ++(11)中是否有定义的顺序来分配局部变量?简而言之:在同一范围内,两个局部变量的析构函数的副作用将以何种顺序显现?

例如。:

struct X{
  ~X(){/*do something*/}
}

int main(){
   X x1;
   X x2;
   return 0;
}

是在main返回时首先销毁x1x2还是在C ++ 11中未定义顺序?

trans by 2020-01-29T22:35:05Z

C ++是否为全局和类静态变量调用析构函数?

在我的示例程序中,看起来在两种情况下都确实调用了析构函数。 在什么时候将其称为全局和类静态变量的析构函数,因为它们应在程序堆栈的数据部分中分配?

trans by 2020-01-29T08:02:00Z

1 2 3 下一页 共3页