class Fraction{ public: Fraction(int n, int d = 1) :m_Numerator(n),m_Denominator(d){} private: int m_Numerator; int m_Denominator; }; int main(){ Fraction frac(8); /*調用轉換構造函數*/ Fraction frac2 = 5; /*附識*/ frac = 5; /*c的類型影射*/ frac = (Fraction)7; /*顯示的臨時變量*/ frac = Fraction(6); frac = static_cast(6); }
class Fraction { public: Fraction(int n,int d):m_number(n),m_Denom(d){ ++ctors; } Fraction(const Fraction& other) :m_number(other.m_number),m_Denom(other.m_Denom){ ++copies; } Fraction & operator= (const Fraction& other){ m_number = other.m_number; m_Denom = other.m_Denom; ++assigns; return *this; } Fraction multiply(Fraction f2){ return Fraction (m_number * f2.m_number, m_Denom * f2.m_Denom); } static void report(); private: int m_number; int m_Denom; static int ctors; static int copies; static int assigns; }; int Fraction::copies = 0; int Fraction::ctors = 0; int Fraction::assigns = 0; #include int main(int argc, char *argv[]) { using namespace std; Fraction twothirds(2,3); Fraction threequarters(3,4); /*以下の二つはコピー構造関数を利用する*/ Fraction acopy(twothirds); Fraction f4 = threequarters; cout << "after declarations /n"; Fraction::report(); f4 = twothirds; cout << "before multiply /n"; Fraction::report(); /*お先にFraction(const Fraction& other)を呼びかける*/ f4 = twothirds.multiply(threequarters); cout << "after multply /n"; Fraction::report(); return 0; } void Fraction::report(){ std::cout << "/n assigns" << assigns; std::cout << "/n ctors" << ctors; std::cout << "/n copies" << copies; }
1 )使用结构的主要优势是什么?
2 )指出类与结构之间存在的至少一个不同点。
类与结构的不同点:1,虽然结构与类的类型不一样,可是他们的基类型都是对象。2,虽然结构的初始化也用了new操作,,可结构对象分配在站上,而不是堆上,3,结构是可以没有继承的。4,结构没有默认的构造函数,但是可以添加构造函数,没有析构函数,没有抽象和封装的概念,在结构中初始化实例字段是错误的。
3 )类作用域与块作用域有何不同
4 )描述应该使用友元函数的两种情形。
友元机制允许非成员函数访问一个类的私有数据,友元可以是一个类,也可以是另外一个类的成员函数,还可以是任何一个非成员函数。1种情形是使用工厂方法,还有一种是使用全局操作符函数。
5 )静态数据成员和非静态数据成员相比有什么不同?
6 )静态成员函数和非静态成员函数之间有什么不同?
一个类的静态数据成员也仅仅在程序开始执行之前创建一次,同样在程序终止的时候销毁。静态数据对象不属于某个特定的对象。它是被该类的所有对象共享。
静态成员函数只能访问静态成员,它没有this指针,属于整个类而非类的对象。
7 )把一个函数申明为const有什么实际含义
表明此函数不能改变主对象的状态,也就是this是一个指向const变量的指针。
8 )试解释如果某个类T有一个原形如下的构造函数将会出现什么问题?T::T(T other);
会出现编译错误。
补充:
转换构造函数:可以只用一个(不同类型的)参数进行调用的构造函数。使用关键字explicit将阻止隐式机制使用此构造函数。
class Timer{ public: /*其所有成员函数都可以访问到m_elapsed*/ friend class Clock; friend void Time::toString(); friend ostream& operator <<(ostream& os, const Timer& obj); private: long m_elapsed; }