(1)构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同)
(2)C++的空类,编译器会加入哪些默认的成员函数: ·默认构造函数和拷贝构造函数 ·析构函数 ·赋值函数(赋值运算符) ·取值函数 **即使程序没定义任何成员,编译器也会插入以上的函数! 注意:构造函数可以被重载,可以多个,可以带参数; 析构函数只有一个,不能被重载,不带参数
(3)拷贝构造函数是C++独有的,它是一种特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。 当没有重载拷贝构造函数时,通过默认拷贝构造函数来创建一个对象 A a; A b(a); A b=a; 都是拷贝构造函数来创建对象b 强调:这里b对象是不存在的,是用a 对象来构造和初始化b的!!
(4)拷贝构造函数重载声明如下: A (const A&other)
class A
{
int m_i
A(const A& other):m_i(other.m_i)
{
Cout<<”拷贝构造函数”<<endl;
}
}
(5)当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值函数。 当没有重载赋值函数(赋值运算符)时,通过默认赋值函数来进行赋值操作 A a; A b; b=a; 强调:这里a,b对象是已经存在的,是用a 对象来赋值给b的!! 赋值运算的重载声明如下: A& operator = (const A& other)
class A;
A a;
A b=a;
A c(a) ;
class A;
A a;
A b;
b = a ;
a.对象不存在,且没用别的对象来初始化,就是调用了构造函数; b.对象不存在,且用别的对象来初始化,就是拷贝构造函数(上面说了三种用它的情况!) c.对象存在,用别的对象来给它赋值,就是赋值函数。
例子:
#include <iostream>
using namespace std;
class Model
{
private:
int val;
public:
Model(int n = 0):val(n){}
Model(const Model &obj)
{ val = 2*obj.val; }
Model &operator=(const Model &obj)
{ val = 4*obj.val; return *this; }
void print()
{
cout << val << endl;
}
};
int main( )
{
Model obj1(10), obj2 = obj1, obj3;
obj3 = obj1;
obj2.print();
obj3.print();
return 0;
}
输出为:20 40
(6)友元函数
#include<iostream>
using namespace std;
class P
{
public:
P( int x, int y )
{
X = x;
Y = y;
}
void Print()
{
cout << "P(" << X << ", " << Y << ")" << endl;
}
friend P operator+( P & pt, int n );
private:
int X, Y;
};
_____P____ operator+( P & pt, int n )
{
P T= pt;
T.X += n;
T.Y += n;
return T;
}
int main()
{
P pt( 10, 10 );
pt = pt + 5;
pt.Print();
return 0;
}
答案:P
(7)以下叙述中正确的是( D )。 A.""(连续两个双引号)是空的字符串,’’(连续两个单引号)是空字符NULL B."\“与’\’ 都是字符串常量 C.”\n"和’\n’都是回车字符 D.’’\x41’和’\101’是等效的 解释: A ‘’(两个连续的单引号)是空字符,不占用内存空间,不是字符常量,常量是有地址的。 B “\“是’\'不是,字符串是双引号。 C 字符是单引号 '\n’是回车字符 D.”\x41"为十六进制:4 * 16 + 1* 0 = 65;’\101’为八进制:1 8^2 + 0 8+1*1 = 65;
|