清华大学c++课程学习记录:4.4系列
#4.4.1构造函数的基本概念
#4.4.2构造函数例题(1)
#4.4.3构造函数例题(2)
#4.4.4委托构造函数
#4.4.5复制构造函数
#4.4.6.复制构造函数调用举例
4.4.1构造函数的基本概念
//
构造函数:
类中的特殊函数:
用于描述初始化算法;
构造函数作用:
在对象被创建时使用特定的值构造函数;
将对象初始化为一个特定的初始状态;
例如:
希望在构建一个Clock类对象时,
将初始时间设为 0:0:0,
就可以通过构造函数来设置。
构造函数的形式:
函数名与类名相同;
不能定义返回值类型,也不能有return语句;
可以有形式参数,也可以没有形式参数;
可以是内联函数;
可以重载;
可以带默认参数值;
构造函数的调用时机:
在对象创建时被自动调用
例如:
Clock muClock(0,0,0)
默认构造函数:
调用时可以不需要实参的构造函数
参数表为空的构造函数;
全部参数都有默认值的构造函数;
下面两个都是默认构造函数,
如在类中同时出现,会产生编译错误:
Clock();
Clock( int newH = 0, int newM = 0,int newS = 0);
隐含生成的构造函数:
如果程序中未定义构造函数,编译器将自动生成
一个默认构造函数
a.参数列表为空,不为数据成员设置初始值;
b.如果类内定义了成员的初始值,则使用类内定义的初始值;
c.如果没有类内成员的初始值,则以默认方式初始化;
d.基本类型的数据默认初始化的值是不确定的;
" = default"
如果程序中已定义构造函数,则默认情况下编辑器不再隐含生成
默认构造函数,如果此时仍希望编辑器隐含生成默认构造函数,
则可以使用" = default"。
例:
class Clock
{
public:
Clock() = default;
Clock( int newH, int newM,int newS );
private:
int hour, minute, second;
};
//
/*
功能:构造函数概念:
*/
# include <iostream>
using namespace std;
int main()
{
return 0;
}
/*
PPT:
构造函数:
类中的特殊函数:
用于描述初始化算法;
构造函数作用:
在对象被创建时使用特定的值构造函数;
将对象初始化为一个特定的初始状态;
例如:
希望在构建一个Clock类对象时,
将初始时间设为 0:0:0,
就可以通过构造函数来设置。
构造函数的形式:
函数名与类名相同;
不能定义返回值类型,也不能有return语句;
可以有形式参数,也可以没有形式参数;
可以是内联函数;
可以重载;
可以带默认参数值;
构造函数的调用时机:
在对象创建时被自动调用
例如:
Clock muClock(0,0,0)
默认构造函数:
调用时可以不需要实参的构造函数
参数表为空的构造函数;
全部参数都有默认值的构造函数;
下面两个都是默认构造函数,
如在类中同时出现,会产生编译错误:
Clock();
Clock( int newH = 0, int newM = 0,int newS = 0);
隐含生成的构造函数:
如果程序中未定义构造函数,编译器将自动生成
一个默认构造函数
a.参数列表为空,不为数据成员设置初始值;
b.如果类内定义了成员的初始值,则使用类内定义的初始值;
c.如果没有类内成员的初始值,则以默认方式初始化;
d.基本类型的数据默认初始化的值是不确定的;
" = default"
如果程序中已定义构造函数,则默认情况下编辑器不再隐含生成
默认构造函数,如果此时仍希望编辑器隐含生成默认构造函数,
则可以使用" = default"。
例:
class Clock
{
public:
Clock() = default;
Clock( int newH, int newM,int newS );
private:
int hour, minute, second;
};
*/
4.4.2构造函数例题(1)
//
/*
功能:构造函数举例
*/
# include <iostream>
using namespace std;
class Clock
{
public:
Clock( int newH, int newM, int newS); //构造函数
void setTime( int newH, int newM, int newS);
void showTime();
private:
int hour, minute, second;
};
//构造函数的实现
Clock::Clock(int newH, int newM, int newS):
hour(newH), minute(newM), second(newS){}
//成员函数的实现
//主函数
int main()
{
Clock c(0,0,0);
c.showTime();
return 0;
}
// /*
功能:构造函数举例
*/
# include <iostream>
using namespace std;
class Clock
{
public:
Clock( int newH, int newM, int newS); //构造函数
void setTime( int newH, int newM, int newS);
void showTime();
private:
int hour, minute, second;
};
//构造函数的实现
Clock::Clock(int newH, int newM, int newS):
hour(newH), minute(newM), second(newS){}
//成员函数的实现
void Clock::setTime( int newH, int newM, int newS )
{
hour = newH;
minute = newM;
second = newS;
}
void Clock::showTime()
{
cout << hour << ":" << minute << ":" << second << endl;
}
//主函数
int main()
{
Clock c(0,0,0);
c.showTime();
return 0;
}
4.4.3构造函数例题(2)
//
/*
功能:构造函数举例
*/
# include <iostream>
using namespace std;
class Clock // 时钟类的定义
{
public: // 外部接口,公有成员函数
Clock( int newH, int newM, int newS); // 构造函数
Clock(); // 默认构造函数
void setTime( int newH, int newM, int newS);
void showTime();
private: // 私有数据成员
int hour, minute, second;
};
//时钟类成员函数的具体实现
//默认构造函数
Clock::Clock():hour(0),minute(0),second(0){ }
//构造函数的实现
Clock::Clock(int newH, int newM, int newS):
hour(newH), minute(newM), second(newS){
}
//成员函数的实现
void Clock::setTime( int newH, int newM, int newS )
{
hour = newH;
minute = newM;
second = newS;
}
void Clock::showTime()
{
cout << hour << ":" << minute << ":" << second << endl;
}
//主函数
int main()
{
//Clock c(0,0,0); // 自动调用构造函数
//c.showTime();
Clock c(8,10,0); // 调用有参数的构造函数
Clock c2; // 调用无参数的构造函数
c.showTime();
c2.showTime();
return 0;
}
4.4.4委托构造函数
//
/*
功能:委托构造函数
*/
# include <iostream>
using namespace std;
int main()
{
return 0;
}
/*
回顾:
Clock类的两个构造函数:
构造函数-
Clock::Clock( int newH, int newM, int newS):
hour(newH), minute(newM), second(newS){
}
默认构造函数-
Clock::Clock: hour(0), minute(0), second(0){ }
委托构造函数:
委托构造函数使用类的其他构造函数执行初始化过程
例如:
Clock::Clock( int newH, int newM, int newS):
hour(newH), minute(newM), second(newS){
}
Clock::Clock():Clock( 0, 0, 0){ }
*/
4.4.5复制构造函数
//
复制构造函数定义:
a.复制构造函数是种特殊的构造函数,其形参为本类的对象引用。
作用是用一个已存在的对象去初始化同类型的新对象。
b.
class 类名
{
public:
类名(形参);// 构造函数
类名(const 类名 &对象名);//复制构造函数
};
类名::类(const 类名 &对象名) //复制构造函数的实现
{ 函数体 }
复制构造函数被调用的三种情况:
a.定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
b.如果函数的形参是类的对象,调用函数时,将使用实参对象初始
化形参对象,发生复制构造;
c.如果函数的返回值是类的对象,函数执行完成返回主调函数是,
将使用return语句中的对象初始化一个临时无名对象,传递给主
调函数,此时发生复制构造;
这种情况可以通过移动构造避免不必要的复制,
隐含的复制构造函数:
a.如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成
一个隐含的复制构造函数;
b.这个构造函数执行的功能是:用初始值对象的每个数据成员,初始
化将要建立的对象的对应数据成员;
" = delect"
如果不希望对象被复制构造:
c++98做法:将复制构造函数声明为private,并且不提供函数的实现;
c++11做法:用"delect"指示编译器不生成默认复制构造函数;
例:
class Point
{
public:
point( int xx=0, int yy=0){ x = xx; y = yy;}//构造函数,内联
Point( const Point& p) =delect;//指示编译器不生成默认复制构造函数
private:
int x, y;//私有数据
};
//
/*
功能:复制构造函数
*/
# include <iostream>
using namespace std;
int main()
{
return 0;
}
/*
复制构造函数定义:
a.复制构造函数是种特殊的构造函数,其形参为本类的对象引用。
作用是用一个已存在的对象去初始化同类型的新对象。
b.
class 类名
{
public:
类名(形参);// 构造函数
类名(const 类名 &对象名);//复制构造函数
};
类名::类(const 类名 &对象名) //复制构造函数的实现
{ 函数体 }
复制构造函数被调用的三种情况:
a.定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
b.如果函数的形参是类的对象,调用函数时,将使用实参对象初始
化形参对象,发生复制构造;
c.如果函数的返回值是类的对象,函数执行完成返回主调函数是,
将使用return语句中的对象初始化一个临时无名对象,传递给主
调函数,此时发生复制构造;
这种情况可以通过移动构造避免不必要的复制,
隐含的复制构造函数:
a.如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成
一个隐含的复制构造函数;
b.这个构造函数执行的功能是:用初始值对象的每个数据成员,初始
化将要建立的对象的对应数据成员;
" = delect"
如果不希望对象被复制构造:
c++98做法:将复制构造函数声明为private,并且不提供函数的实现;
c++11做法:用"delect"指示编译器不生成默认复制构造函数;
例:
class Point
{
public:
point( int xx=0, int yy=0){ x = xx; y = yy;}//构造函数,内联
Point( const Point& p) =delect;//指示编译器不生成默认复制构造函数
private:
int x, y;//私有数据
};
*/
4.4.6.复制构造函数调用举例
//
/*
功能:复制构造函数调用举例
*/
# include <iostream>
using namespace std;
class Point
{
public:
Point( int xx=0, int yy=0){ x = xx; y = yy;}//构造函数,内联
int getX() {return x;}
Point( const Point& p);//=delect;//指示编译器不生成默认复制构造函数
private: //私有数据
int x, y;
};
//成员函数实现
Point::Point( const Point & p)
{
x = p.x;
y = p.y;
cout << "Calling the copy constructor" << endl;
}
//形参为Point类对象的函数
void fun1( Point p)
{
cout << p.getX() << endl;
//p.setX(1);
}
//返回值为Point类对象的函数
Point fun2()
{
Point a;
return a;
}
int main()
{
Point a; //第一个对象A
Point b(a); //情况一,用A初始化B。第一次调用拷贝构造函数
cout << b.getX() << endl;
fun1(b); //情况二,对象B作为fun1的实参。第一次调用拷贝构造函数
b = fun2(); //情况三,函数返回值是类对象,函数返回时,调用拷贝构造函数
cout << b.getX() << endl;
return 0;
}
本文只用于学习!