第 8 章基本 C++ 程式碼整理如下
Reference: I Horton, Ivor Horton's Beginning Visual C++ 2013 (Wiley 2014).
8.1 Class Destructors
∎ Simple destructor
// Destructor definition
CBox::~CBox()
{
cout << "Destructor called." << endl;
}
∎ Dynamic memory allocation
// Constructor definition
CMessage::CMessage(const char* text = "Default message")
{
cout << "Constructor called." << endl;
size_t length {strlen(text) + 1};
m_pMessage = new char [length];
strcpy_s (m_pMessage, length, text);
}
// Destructor to free memory allocated by new
CMessage::~CMessage()
{
cout << "Destructor called." << endl;
delete [] m_pMessage;
}
8.2 Implementing a Copy Constructor
∎ Copy constructor (different from a default copy constructor) // Constructor definition
CMessage::CMessage(const CMessage& aMess)
{
size_t length {strlen(aMess.m_pMessage) + 1};
m_pMessage = new char [length];
strcpy_s(m_pMessage, length, aMess.m_pMessage);
}
8.3 Operator Overloading
∎ Operator functions
// Main.cpp
if (mediumBox < bigBox)
cout << "mediumBox < bigBox." << endl;
else
cout << "mediumBox NOT < bigBox." << endl;
if (thatBox == mdeiumBox)
cout << "thatBox = mediumBox." << endl;
else
cout << "thatBox NOT = mediumBox." << endl;
if (mediumBox > 50.0)
cout << "mediumBox capacity > 50." << endl;
else
cout << "mediumBox capacity NOT > 50." << endl;
// Operator functions in CBox.cpp
bool CBox::operator<(const CBox& aBox) const
{
return this->volume () < aBox.volume ();
}
bool CBox::operator==(const CBox& aBox) const
{
return this->volume () == aBox.volume();
}
bool CBox::operator>(const double value) const
{
return this->volume () > value;
}
∎ Overloaded assignment operator
// Overloaded assignment operator for CMessage objects
CMessage& CMessage::opeartor=(const CMessage& aMess)
{
if (this != &aMess)
{
delete [] m_pMessage;
size_t length {strlen(aMess.m_pMessage) + 1};
m_pMessage = new char [length];
strcpy_s(this->m_pMessage, length, aMess.m_pMessage);
}
return *this;
}
∎ Addition operator
// Function to add two CBox objects
CBox::CBox operator+(const CBox& aBox) const
{
return CBox(std::max(m_length, aBox.m_length),
std::max(m_width, aBox.m_width),
m_height + aBox.m_height);
}
8.4 The Object Copying Problem
∎ Addition operator
// Main.cpp
motto3 = motto1 + motto2;
// Tracing object copy operations in CMessage.cpp
// Addition operator function (step 1)
CMessage::CMessage operator+(const CMessage& aMess) const
{
cout << "Add operator function called." << endl;
size_t length {strlen(m_pMessage) + strlen(aMess.m_pMessage) + 1};
CMessage message;
message.m_pMessage = new char [length];
strcpy_s(message.m_pMessage, length, m_pMessage);
strcat_s(message.m_pMessage, length, aMess.m_pMessage);
return message;
}
// Copy constructor (step 2)
CMessage::CMessage(const CMessage& aMess)
{
cout "Copy constructor called." << endl;
size_t length {strlen(aMess.m_pMessage) + 1};
m_pMessage = new char [length];
strcpy_s(m_pMessage, length, aMess.m_pMessage);
}
// Assignment operator function (step 3)
CMessage& CMessage::operator=(const CMessage& aMess)
{
cout << "Assignment operator function called." << endl;
if this != aMess)
{
delete [] m_pMessage;
size_t length {strlen(aMess.m_pMessage) + 1};
m_pMessage = new char [length];
strcpy_s(this->m_pMessage, length, aMess.m_pMessage);
}
return *this;
}
∎ Move constructor (cf. copy constructor)
CMessage:: CMessage(Cmessage&&aMess)
{
cout << "Move constructor called." << endl;
m_pMessage = aMess.m_pMessage;
aMess.m_pMessage = nullptr; // Not const, so permitted
}
∎ Move assignment operator function (cf. assignment operator function)
CMessage& CMessage::operator=(CMessage&& aMess)
{
cout << "Move assignment operator function called." << endl;
delete [] m_pMessage;
m_pMessage = aMess.m_pMessage;
aMess.m_pMessage = nullptr;
return *this;
}
8.5 Default Class Members
8.6 Class Templates
8.7 Perfect Forwarding
8.8 Default Arguments for Template Parameters
8.9 Aliases for Class Templates
8.10 Template Specialization
8.11 Using Classes
8.12 Organizing Your Program Code
8.13 Library Classes for Strings
8.14 Summary
沒有留言:
張貼留言