olan dizi nesneleri başlatma Aşağıdaki gibi başlatma ifadesini kullanarak dizi nesnelerini başlatma işlemini gerçekleştirmek istiyorum.Sınıfının bazı ctor/dtor değeri
TestClass array[5] = {
TestClass("test1"),
TestClass("test2"),
TestClass("test3"),
TestClass("test4"),
TestClass("test5")
};
C++ için ARM (açıklamalı referans manuel) gibi bazı güvenilir kitabın göre, bu yapıcı/yıkıcı sahip nesne diziyi başlatmak için bir yol olduğunu söylüyor gibi görünüyor. Bunu takiben, aşağıdaki örnek kodu oluşturdum ve ne olduğunu görün. GNU GCC kullanarak, yukarıdaki kaynak kod (4.1.2) hazırlanması için, ilk deneme için de
#include <iostream>
#include <sstream>
#include <string>
class TestClass
{
public:
TestClass(const char* name) : name_(name)
{
std::cout << "Ctor(const char*) : " << name_ << std::endl;
}
~TestClass()
{
std::cout << "Dtor() : " << name_ << std::endl;
}
TestClass() : name_("")
{
}
void print()
{
std::cout << "obj:" << name_ << std::endl;
}
private:
TestClass(const TestClass& rhs);
std::string name_;
};
int main()
{
TestClass array[5] = {
TestClass("test1"),
TestClass("test2"),
TestClass("test3"),
TestClass("test4"),
TestClass("test5")
};
for (unsigned int i = 0; i < sizeof(array)/sizeof(array[0]); ++i) {
array[i].print();
}
return EXIT_SUCCESS;
}
, aşağıdaki gibi bir üreterek başarısız oldu.
error: ‘TestClass::TestClass(const TestClass&)’ is private
Yani bu nesne dizisi başlatma izin vermek için, bu kopya kurucu 'gerektirecektir anlamına geldiğini anladı. Daha sonra, yukarıdaki kodu kullanıcı tanımlı (ortak) kopya oluşturucuyu aşağıdaki gibi tanıtarak derlemeye çalıştım. Kaynak kodunu başarıyla derleyebilirim. Ancak, yukarıdaki yapıyı kurduğumda aşağıdaki çıktıyı elde ettim. Ben şu merak edilir olduğum şey
Ctor(const char*) : test1
Ctor(const char*) : test2
Ctor(const char*) : test3
Ctor(const char*) : test4
Ctor(const char*) : test5
obj:test1
obj:test2
obj:test3
obj:test4
obj:test5
Dtor() : test5
Dtor() : test4
Dtor() : test3
Dtor() : test2
Dtor() : test1
,
biz özel olarak beyan kopya kurucu yapamaz Neden?
Kullanıcı tanımlı kopya kurucusu neden çağrılmıyor (Çıktının "Kopya Kopyalama: xxxx") içermesi bekleniyordu, ancak bunu alamadım. Bu nedenle, kullanıcı tanımlı kopya kurucusunun anladığını anladım. müracaat edilmemiştir.) Aslında
, yukarıdaki GNU GCC özeldir veya bazılarınız bana doğru verebilir bu C++ dilinin özellikleri ... sevindirici olabilir olup olmadığını gerçekten emin değilim Yukarıdaki işaretçi.
_test_ '-fno elide-constructors 'ile çalışmak isteyebilirsiniz. –
Benzer durum burada: [Kopya-başlatmanın garip davranışı, kopya yapıcıyı çağırmıyor!] (Http://stackoverflow.com/questions/6163040/strange-behavior-of-copy-initialization-doesnt-call- the-copy-constructor) – Nawaz