拷贝构造函数和友元
C++控制类对象私有部分的访问,但有时候需要在类的外部访问类的私有成员,这种情况下C++提供了友元机制。
//
// main.cpp
// CPlusPlusLanguage
//
// Created by idea on 2016/12/16.
// Copyright © 2016年 idea. All rights reserved.
//
#include <iostream>
using namespace std;
class demo{
private:
int i;
public:
demo(){ //构造
cout << "demo" << endl;
}
demo(const demo &it){ //拷贝构造
cout << "copy demo" << endl;
}
~demo(){ //析构
cout << "~demo" << endl;
}
void set_i(int i){
this-> i= i;
}
int get_i(){
return i;
}
friend void test_3();;//意思是声明一个该类的友元函数
friend class demo1;//意思是声明一个该类的友元类
};
int main_1(int argc, const char * argv[]) {
demo d; //声明一个实例,自动调用构造函数
d.set_i(100);
// demo d1=d; //这个操作导致拷贝构造函数的调用
// demo d1(d); //和上面的语句等效
demo d1;
d1=d; //这个地方没有调用拷贝构造,只是简单的=号赋值
std::cout << "d1.get_i()=" << d1.get_i() << endl;
std::cout << "Hello, World!\n";
return 0;
}
void test(demo d){
d.set_i(100);
}
void test_1(demo &d){ //在c++里面,如有一个函数的参数是对象,就会有拷贝构造发生,使用引用可以避免
d.set_i(100);
}
int main_2(int argc, const char * argv[]) {
demo d; //声明一个实例,自动调用构造函数
test(d); //类作为参数传给另外一个函数,会调用拷贝构造函数
std::cout << "d.get_i()=" << d.get_i() << endl; //这个地方输出未被初始化的值
std::cout << "Hello, World!\n";
return 0;
}
demo test(){
demo d;
return d;
}
int main3(int argc, const char * argv[]) {
demo d=test(); //不同的编译器和不同的操作系统 回有不同的结果,表示:c++只是一种规范,跨平台的应用要考虑这个问题
std::cout << "Hello, World!\n";
return 0;
}
void test_3(){
demo d;
cout << d.i << endl;
}
class demo1
{
public:
demo1()
{
demo d;
d.i = 100;
}
friend class demo2;
};
class demo2
{
public:
demo2()
{
demo d;
// d.i = 100; //我的朋友的朋友,不能等同于是我的朋友
}
};
int main(int argc, const char * argv[]) {
test_3();
std::cout << "Hello, World!\n";
return 0;
}
网友评论