嘀嘀咕(2)

1.内联函数(inline)

编译器直接将函数体插入在函数调用的地方
没有普通函数调用时的额外开销(压栈,跳转,返回)
内联函数  由编译器处理;宏代码片段  由预处理器处理

本质:以牺牲代码段空间为代价,提高程序的运行时间的效率。(以空间换时间)

2.占位参数

void fun(int x, int)
{
    cout<<"x="<<x<<endl;
}

fun(100,10);    //10参数无效

3.函数重载

函数名相同;参数列表不同

4.拷贝构造函数

class Test
{
public:
    Test()
    {
        m_x = 0;
        m_y = 0;
    }

    //显示拷贝构造函数
    Test(const Test &t)
    {
        m_x = t.m_x;
        m_y = t.m_y;
    }


private:
    int m_x;
    int m_y;
};


Test t1;

//调用拷贝构造函数
Test t2(t1);    //法1
Test t3 = t1;   //法2

//t3赋值操作(并不是在t3创建的时候初始化)
//Test t3;
//t3 = t1;

例1

class Test
{
public:
	Test()
	{
		cout << "test()..." << endl;
		m_x = 0;
		m_y = 0;
	}
	Test(int x, int y)
	{
		cout << "Test(int x, int y)..." << endl;

		m_x = x;
		m_y = y;
	}
	Test(const Test & another)
	{
		cout << "Test(const Test &)..." << endl;
		m_x = another.m_x;
		m_y = another.m_y;
	}

	void operator=(const Test &another)
	{
		cout << "operatoer = (const Test &)" << endl;
		m_x = another.m_x;
		m_y = another.m_y;
	}

	void printT() {
		cout << "x = " << m_x << ", m_y = " << m_y << endl;
	}

	~Test() {
		cout << "~Test()..." << endl;
	}
private:
	int m_x;
	int m_y;
};


void func(Test t)//Test t = t1; //Test t 的拷贝构造函数
{
	cout << "func begin..." << endl;
	t.printT();
	cout << "func end..." << endl;
}

void test3()
{
	cout << "test3 begin..." << endl;
	Test t1(10, 20);

	func(t1);

	cout << "test3 end..." << endl;
}

例2

Test func2()
{
	cout << "func2 begin..." << endl;
	Test temp(10, 20);
	temp.printT();

	cout << "func2 end..." << endl;

	return temp;
}//匿名的对象 = temp  匿名对象.拷贝构造(temp)

void test4()
{
	cout << "test4 being.. " << endl;
	func2();// 返回一个匿名对象。 当一个函数返回一个匿名对象的时候,函数外部没有任何
			//变量去接收它, 这个匿名对象将不会再被使用,(找不到), 编译会直接将个这个匿名对象
			//回收掉,而不是等待整改函数执行完毕再回收.
	        //匿名对象就被回收。
	
	cout << "test4 end" << endl;
}

例3

Test func2()
{
	cout << "func2 begin..." << endl;
	Test temp(10, 20);
	temp.printT();

	cout << "func2 end..." << endl;

	return temp;
}//匿名的对象 = temp  匿名对象.拷贝构造(temp)

void test5()
{
	cout << "test 5begin.. " << endl;
	Test t1 = func2(); //会不会触发t1拷贝构造来   t1.拷贝(匿名)?
						//并不会触发t1拷贝,而是 将匿名对象转正 t1,
						//把这个匿名对象 起了名字就叫t1

	cout << "test 5 end.." << endl;
}

例4

void test6()
{
	cout << "test6 begin..." << endl;
	Test t1;        //t1已经初始化了。

	t1 = func2();   //t1已经被初始化了,所以func2返回的匿名对象不会再次转正,而依然是匿名对象。
					//所以t1会调用等号操作符,t1.operator=(匿名对象), 然后编译器会立刻回收掉匿名对象

	t1.printT();

	cout << "test6 end.." << endl;
}

5.类的深拷贝、浅拷贝(同c中结构体)

6.构造函数的初始化列表

1.产生原因:

class  A  {
public:
    A(int  a)  {
        m_a  =  a;
    }
private:
    int  m_a;
};

class  B  {
public:
    B(int  b)  {
        m_b  =  b;
    }
private:
    int  m_b;
    A  obja;      //当A的对象  是B类的一个成员 并且 A没有默认构造函数
                    //在初始化B对象的时候,无法给B  分配空间,因为无法初始化A类对象
                    //(或者:B中包含const 变量,要用构造函数初始化列表)
};

int  main(void)
{
    A  obja(10);
    B  objb(20);//error,  
    return  0;
}

2.

class A
{
public:
    A(int a)
    {
        cout << "A()..."<<a << endl;
        m_a = a;
    }

    ~A() {
        cout << "~A()" << endl;
    }
    void printA() {
        cout << "a = " << m_a << endl;
    }


private:
    int m_a;
};



class B
{
public:
    //构造函数的初始化列表
    B(A a1, A a2, int b) : m_a1(a1), m_a2(a2)
    {
        cout << "B(A&, A&, int)..." << endl;
        m_b = b;
    }

    //构造对象成员的顺序跟初始化列表的顺序无关
    //而是跟成员对象的定义顺序有关(private中)
    B(int a1, int a2, int b) : m_a1(a1), m_a2(a2)
    {
        cout << "B(int, int, int)..." << endl;

        m_b = b;
    }

    void printB() {
        cout << "b = " << m_b << endl;
        m_a1.printA();
        m_a2.printA();
    }

    ~B()
    {
        cout << "~B().." << endl;
    }
private:
    int m_b;
    A m_a2;
    A m_a1;
};

void test1()
{
    A a1(10), a2(100);

    B b(a1, a2, 1000);

    b.printB();
}

3.构造中调⽤用构造是危险的⾏行为

class  MyTest
{
public:
    MyTest(int  a,  int  b,  int  c)
    {
        _a  =  a;
        _b  =  b;
        _c  =  c;
    }
    MyTest(int  a,  int  b)
    {
        _a  =  a;
        _b  =  b;
        MyTest(a,  b,  100);  //产⽣生新的匿名对象
    }
    ~MyTest()
    {
        printf("MyTest~:%d,  %d,  %d\n",  _a,  _b,  _c);
    }
    int  getC()
    {
        return  _c;
    }
    void  setC(int  val)
    {
        _c  =  val;
    }

private:
    int  _a;
    int  _b;
    int  _c;
};

int  main()
{
    MyTest  t1(1,  2);
    printf("c:%d\n",  t1.getC());  //请问c的值是?
    return  0;
}

posted @ 2018-10-21 13:54  神秘的火柴人  阅读(169)  评论(0编辑  收藏  举报