[ C++�ŊJ�� ]

�R���X�g���N�^

C++�̃R���X�g���N�^�ɂ‚���

�{�y�[�W�͂����ɏ��ЁuEffective C++�v����

�R���X�g���N�^

�f�t�H���g�R���X�g���N�^

C++�ł́A�N���X���`�����Ƃ��ɃR���X�g���N�^���`���Ȃ���΁A�R���p�C���������I�Ɉ����Ȃ��̃R���X�g���N�^����уR�s�[�R���X�g���N�^��⊮���܂��B

class Person {
    std::string name;
};

�ƋL�q�����N���X�́A�f�t�H���g�R���X�g���N�^�A�f�t�H���g�f�X�g���N�^�A�f�t�H���g�R�s�[�R���X�g���N�^�A�f�t�H���g������Z�q�֐����R���p�C���ɂ���ĕ⊮����A�����ȉ��̃R�[�h�Ɠ����ɂȂ�܂��B

class Person {
    std::string name;
public:
    Person() {}
    ~Person() {}
    Person(const Person& aPerson) { ... }
    Person& operator=(const Person& rhs) { ... }
};

�����ŁA�����o�[�ϐ���std::string& name��const std::string�ł���ƕύX��

�R�s�[�R���X�g���N�^

�R�s�[�R���X�g���N�^�������

void func1(Person a);
Person func2();

    Person p1;
    Person p2(p1);  // �R�s�[�R���X�g���N�^�����s�A--- (1)
    Person p3 = p2; // �R�s�[�R���X�g���N�^�����s�A������Z�q�֐��͎��s����Ȃ�
    func1(p3);      // �R�s�[�R���X�g���N�^�����s�A�����ւ̒l�n��
    p1 = func2();   // �R�s�[�R���X�g���N�^�����s�A�߂�l�̒l�n�� 

���������X�g

�ǂ��Ȃ��R���X�g���N�^�ł̃����o�[�ϐ�������

std::string�������o�[�Ɏ��ƒN���XPerson���l���܂��B

class Person {
    std::string name;
public:
    Person(const std::string &aName) { name = aName; }
};

����ňꌩ�悢�悤�Ɏv���܂��B�������A���̃R�[�h�ł͗]���ȏ������������܂��B

  1. Person�N���X�̃C���X�^���X�𐶐����悤�Ƃ���
  2. �����o�ϐ�(string)�̃C���X�^���X����̃R���X�g���N�^�����s���Đ�������
  3. Person�N���X�̃R���X�g���N�^�{�̂����s����
  4. �����Ŏw�肵��string�C���X�^���X�������o�ϐ�name�փR�s�[����=���Z�����s�����

2.�̂Ƃ��ɁAstring�N���X�̃R���X�g���N�^�����s����܂��B�����ăR���X�g���N�^�{�̂̎��s�ɂ����āA=���Z�q���Ăяo����string�C���X�^���X���R�s�[���܂��B���������āA2.�Ŏ��s�����R���X�g���N�^�͖��Ӗ��ł��B

�����o�[�ϐ��������͏��������X�g��

class Person {
    std::string name;
public:
    Person(const std::string &aName) : name(aName) {}
};
  1. Person�N���X�̃C���X�^���X�𐶐����悤�Ƃ���
  2. ���������X�g���̒�`(name�̏��������X�g�j�����{����
  3. Person�N���X�̃R���X�g���N�^�{�̂����s����

�����Ȃ��R���X�g���N�^�ł��������q���X�g��

class Person {
    std::string name;
public:
    Person() : name() {}
};

���N���X�̏��������������q���X�g��

class Student : public Person {
    int id;
public:
    Student() : Person(), id(0) {}
};

explicit�ȕϊ��R���X�g���N�^

������1�‚̃R���X�g���N�^�́A�v�������Ȃ��ϊ����s�����Ƃ�����܂��B

class Counter {
    int count;
public:
    Count(int init) : count(init) {}
};

�ƈ�����int�^��1�Ž��R���X�g���N�^���`�����N���X������ƁA�ȉ��̂悤�ȋǖʂ�Counter�C���X�^���X����������܂��B

    Counter pageHit;
        :
    pageHit = 14;

�E�Ӓl��int�^��14��Counter�ɕϊ����悤�Ƃ��܂��B���̍�Counter(14)���Ă΂�邱�ƂɂȂ�܂��B���̂Ƃ��A�R���X�g���N�^��explicit�錾��lj�����ƁA�ϊ����s��ꂸ�A�R���p�C���G���[�ɂȂ�܂��B

class Counter {
    int count;
public:
    explicit Count(int init) : count(init) {}
};

�����I�ɃR���X�g���N�^���Ăяo�����A�L���X�g���w�肷��K�v������܂��B

    Counter pageHit;
        :
    pageHit = Counter(14);
    pageHit = static_cast<Counter>(14);

��O�F�R�s�[�R���X�g���N�^��explicit�錾���Ȃ�

�R�s�[�R���X�g���N�^���������P�‚ł����A�����explicit�錾����ƁA�֐��̈����E�߂�l�ɒl�n�����g�p���邱�Ƃ��ł��Ȃ��Ȃ�܂��B