在this关键字之前是冒号。 任何人都可以解释在这种情况下冒号是什么意思? 我不相信这是真的。 谢谢 using System; namespace LinkedListLibrary { class ListNode { private object data; private ListNode next; public ListNode(object dataValue) : this(dataValue, null) { } public ListNode(object dataValue, ListNode nextNode) { data = dataValue; next = nextNode; } public ListNode Next { get { return next; } set { next = value; } } […]
我有这个代码: class A { public: A() = default; private: int i = 1; }; int main() { const A a; return 0; } 它在g ++(见ideone )上编译得很好,但在clang ++上失败,出现错误: consttypes“const A”的对象的默认初始化需要用户提供的默认构造函数 我在LLVM bug跟踪器上报告了这个问题,并将其视为无效。 我认为试图说服铿锵的开发者绝对毫无意义。 另一方面,我看不出这种限制的原因。 任何人都可以build议,如果C ++ 11标准莫名其妙地暗示此代码是无效的? 或者我应该只是向g ++报告错误? 或者,也许在语言规则方面有足够的自由来处理这些代码?
我观看了道格拉斯·克罗克福德(Douglas Crockford)关于Javascript中好的部分的讲话 ,我的眼睛被打开了。 有一次,他说:“Javascript是唯一的语言,好的程序员相信他们可以有效地使用它,而不需要学习它。” 然后我意识到, 我就是那个人。 在那个演讲中,他发表了一些对我来说非常惊人和有见地的发言。 例如,JavaScript是这个星球上最重要的编程语言。 或者它是这个星球上最stream行的语言。 而且,这是以许多严重的方式被打破的。 他对我所做的最令人吃惊的表述是“新的危险”。 他不再使用它了。 他也不使用this 。 他为Javascript中的构造函数提供了一个有趣的模式,允许私有和公共成员variables,并且不依赖于new ,也不依赖this 。 它看起来像这样: // neo-classical constructor var container = function(initialParam) { var instance = {}; // empty object // private members var privateField_Value = 0; var privateField_Name = "default"; var privateMethod_M1 = function (a,b,c) { // arbitrary }; // initialParam […]
编辑:答案摘要 在下面,B是A的一个子类。 这是一个术语问题; 因为B 不能从A的接口借用,所以Ctors和dtors 不是inheritance的。 一个类至less有一个构造函数,并且只有一个析构函数。 构造函数 : B不从Ainheritance构造函数; 除非B的明确地呼叫A的Ctor 之一,否则A的默认Ctor会在 B的Ctor主体之前被自动调用(这个想法是A在B被创build之前需要被初始化)。 破坏者 : B不inheritanceA的dtor; B退出后,B的析构函数会自动调用A的析构函数。 致谢:特别要感谢Oli Charlesworth和Kos的回答,我把Kos的答案设定为解决scheme,因为这是我最理解的。 原来的post 当您在Google上search“C ++析构函数inheritance网站:stackoverflow.com”时,您当前find以下post: 构造函数和析构函数inheritance :具有30k +声望的两个用户说它是inheritance的,而不是 虚拟析构函数是inheritance的吗? :这里没有提到会指向不被inheritance的析构函数 C ++中的析构函数和inheritance? :评论似乎表明析构函数是inheritance的 Q1:我从实践中知道的是,如果不明确定义派生类的构造函数,就不能用相同的原型初始化派生对象,这是正确的吗? 即使从post中可以清楚地看到,析构函数似乎是被inheritance的,但是我仍然对这样一个事实感到困惑,那就是32k声誉的用户不会这么说。 我写了一个小例子来说明大家的想法: #include <cstdio> /******************************/ // Base class struct A { A() { printf( "\tInstance counter = %d (ctor)\n", ++instance_counter ); } ~A() { […]
我如何在C#中使用构造函数,如下所示: public Point2D(double x, double y) { // … Contracts … X = x; Y = y; } public Point2D(Point2D point) { if (point == null) ArgumentNullException("point"); Contract.EndContractsBlock(); this(point.X, point.Y); } 我需要它不复制另一个构造函数的代码…
在C ++中,下面的代码给出了一个编译器错误: void destruct1 (int * item) { item->~int(); } 这个代码几乎是一样的,我只是键入int到另一个types,并发生了一些奇迹: typedef int myint; void destruct2 (myint * item) { item->~myint(); } 为什么第二个代码有效? 一个int得到一个析构函数是因为它已被typedefed? 如果你想知道为什么有人想这样做:这是来自重构C ++代码。 我们正在删除标准堆,并用自制池replace它。 这要求我们调用placement-new和析构函数。 我知道为基元types调用析构函数是没用的,但是我们希望它们在代码中,以防我们用实际的类来replacePOD。 发现赤裸裸的int不工作,但typedefed的做是一个惊喜。 顺便说一句 – 我有一个涉及模板function的解决scheme。 我们只需在模板中inputdef,一切都很好。
在C ++中,如果构造函数抛出一个exception,什么析构函数运行? 特别是,如果在初始化列表或主体期间发生exception,它会有什么区别吗? 另外,inheritance和成员呢? 大概所有完成的build筑被破坏。 如果只有一些成员构build,只有那些被破坏? 如果有多重inheritance,那么所有完成的构造函数是否被破坏? 虚拟inheritance是否改变了什么?
VC ++使得在类声明内联函数中实现的函数成为可能。 如果我按如下方式声明Foo类,那么CONSTRUCTOR和DESTRUCTOR内联函数是什么? class Foo { int* p; public: Foo() { p = new char[0x00100000]; } ~Foo() { delete [] p; } }; { Foo f; (f); }
我在这里做了一个testing,但输出是一个没有结束的循环,我不知道为什么。 其实我正在做另一个testing,但是当我写这个时,我不明白这个循环是怎么发生的。 重复输出“ABC”。 #include <map> #include <string> #include <iostream> class test { public: std::map <int, int> _b; test(); test (std::map<int, int> & im); ~test(); }; test::test() { std::cout<<"abc"; _b.clear(); _b[1]=1; test(_b); } test::test(std::map <int, int>& im) { std::cout<<im[1]; } test::~test() {}; int main () { test a; }
在C#中,当你这样做 Class(Type param1, Type param2):base(param1) 是先执行的类的构造函数,然后调用超类的构造函数,或者先调用基构造函数?