Имеем код:
#include <iostream>
class C1
{
int i;
public:
C1(int I) {i = I; std::cout << "C1 int constructor" <<std::endl;}
C1(const C1& c) {i = c.i; std::cout << "C1 copy construcror" << std::endl;}
C1& operator=(const C1& c ) {i = c.i; std::cout <<"C1 operator =" << std::endl; return *this;}
~C1() {std::cout << "C1 destructor " << i << std::endl; }
};
int main()
{
C1 c1 = C1(2);
}
который выдает:
% g++ -std=c++98 -pedantic -Wall -Wextra c++test15.cc
% ./a.out
C1 int constructor
C1 destructor 2
Заметьте при инициализации переменной с1 в main вызывается «C1 int constructor» а о копирующем конструкторе не слова. теперь меняем код:
...
explicit C1(const C1& c) {i = c.i; std::cout << "C1 copy construcror" << std::endl;}
...
В итоге имеем:
% g++ -std=c++98 -pedantic -Wall -Wextra c++test15.cc
c++test15.cc: In function 'int main()':
c++test15.cc:17: error: no matching function for call to 'C1::C1(C1)'
c++test15.cc:8: note: candidates are: C1::C1(int)
Что называется опаньки! Да типа по правилам языка при инициализации вызывается копирующий конструктор, а он закрыт вот и не собралось. Но если я при инициализации хочу в копирующем конструкторе кое что лишнее сделать то «хрен вам молодые люди», нужный конструктор не вызовется! Вот такая прикольная фича в компиляторе...