//source.cpp
CClass::CClass(){} //Первый конструктор
CClass::CClass(int a){} //Второй конструктор
//main.cpp
CClass obj; //вызываем первый конструктор
obj = 1; //вызываем второй конструктор
А если, например, вы объявите большой массив объектов ... по нему всё равно пройдётся конструктор по умолчанию?
CClass objs[512];
затем потихоньку его заполнить - по нему всё равно пройдётся конструктор по умолчанию
CClass obj(); // на самом деле так писать нельзя, это не вызов конструктора а объявление функции
obj = CClass(1);
Foo(const Foo &foo); // Конструктор копирования
Foo(int i); // Неявный конструктор
Foo& Foo::operator= (const Foo &foo); // Оператор присваивания
explicit
, тогда запись obj = 1;
будет некорректной. CClass::CClass(){}
CClass::CClass(int a){
std::(cout<<"invoked");
}
#include <iostream>
using namespace std;
class A
{
int myint;
public:
A():myint(0)
{
cout<<"Is A() "<<myint<<endl;
}
A(int i):myint(i)
{
cout<<"Is A(int) "<<myint<<endl;
}
};
int main()
{
A a;
a = 1;
A b = 2;
A c(3);
A(4);
A() = 5;
a = 7;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
class Foo
{
private:
string m_name;
const string m_name_on_born;
public:
Foo (const string &name): m_name(name), m_name_on_born(name) {
cout <<"Hi! I am " << m_name << endl;
}
~Foo() {
cout << m_name << " (on born be " << m_name_on_born << ") be destructed" << endl;
};
Foo& operator=(const Foo &other) {
cout <<"Hi! I am " << m_name << ". ";
cout << "But i be renamed to " << other.m_name << endl;
m_name = other.m_name;
return *this;
}
};
int main(int argc, char const *argv[])
{
Foo foo("foo");
foo = string("tmp");
return 0;
}
#include <iostream>
using namespace std;
class A
{
int myint;
public:
A():myint(0)
{
cout<<"A():myint(0) myint == "<<myint<<endl;
}
A(int i):myint(i)
{
cout<<"A(int i):myint(i) myint == "<<myint<<endl;
}
~A()
{
cout<<"delete A()"<<endl;
}
/*A& operator=(int i)
{
myint = i;
cout<<"operator=(int &i) myint == "<<myint<<endl;
return *this;
}*/
};
int main()
{
A a;
a = 2;
return 0;
}
#include <iostream>
using namespace std;
class A
{
int myint;
public:
A():myint(0)
{
cout<< this << " A():myint(0) myint == "<<myint<<endl;
}
A(int i):myint(i)
{
cout<< this << " A(int i):myint(i) myint == "<<myint<<endl;
}
~A()
{
cout<< this << " delete A()"<<endl;
}
};
int main()
{
A a;
a = 2;
return 0;
}
CClass obj; //вызываем первый конструктор
obj = 1; // оператор присваивания
CClass obj2 = obj; // Конструктор копирования
Компилятор автоматически генерирует оператор присваивания, который копирует объект побайтово.
The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members.
The implicitly-defined copy/move assignment operator for a non-union class X performs memberwise copy/move assignment of its subobjects.