拷贝构造与友元

拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象;友元可以让一个类的所有属性(主要是private)对特定的类开放

拷贝构造

如果没有复写拷贝构造函数,系统会帮我们默认生成改函数

#include <iostream>
using namespace std; class Demo {
private:
int a;
public:
void set(int a) {this->a = a;}
int get() {return a;}
}; int main(int argc, char **argv) {
Demo demo;
demo.set(100);
Demo demo1 = demo; //调用拷贝构造函数
cout << demo1.get() << endl;
}

在上面的代码中,即使a是私有成员,也会将其值赋给新对象,因为拷贝构造是全员拷贝的。

Demo demo1 = demo;

上面的代码在编译时会被翻译成下面的代码(其实是=号操作符被重载了),我们也可以使用下面的代码显示的调用拷贝构造函数

Demo demo1(demo);

涉及到指针的拷贝

如果类成员中有指针,则需要自己实现拷贝构造函数,即进行深拷贝。

class Demo {
private:
char *str;
public:
Demo(){str = new char[10];}
~Demo(){delete []str;}
Demo(const Demo &demo) { //自定义拷贝构造函数
str = new char[10];
strcpy(str, demo.str);
}
};

上面的代码中新对象和旧对象中str指针将会指向不同的内存区域。如果我们不实现拷贝构造,那么编译器会简单的将旧对象中str的值赋值给新对象,这样两个对象中str将会指向同一块内存区域,比较危险

拷贝构造与赋值操作

int main(int argc, char **argv) {
Demo demo;
Demo demo2;
demo2 = demo; // 不会调用拷贝构造
Demo demo3 = demo; // 调用拷贝构造
}

在main函数的第三行代码中只是发生了赋值操作,即将demo对象中所有的属性赋值给demo2,并不会调用拷贝构造函数(这里可能会引起内存泄露);在第四行代码中将会发生拷贝构造

友元

友元类

友元是将自己本来不想开放的属性和方法对特定的类进行开放。

**友元关系是单向的,且友元关系不具备传递性"

#include <iostream>
#include <cstring>
using namespace std; class Demo {
private:
char *str;
void test(){cout << "this is demo" << endl;}
friend class Demo1; }; class Demo1 {
public:
Demo1(){Demo demo; demo.test();}
}; int main(int argc, char **argv) {
Demo1 demo1;
}

上面的例子中Demo将Demo1设为自己的友元,所以在Demo1可以访问Demo中的私有属性。

友元方法

#include <iostream>
#include <cstring>
using namespace std; class Demo {
private:
char *str;
void test(){cout << "this is demo" << endl;}
friend void test();
}; void test() {
Demo demo;
demo.test();
} int main(int argc, char **argv) {
test();
}

将某个方法设置为自己的友元方法,但是在面向对象编程中一般很少用到友元方法

C++之旅:拷贝构造与友元的更多相关文章

  1. C++拷贝构造&操作符重载

    头文件 DString.h如下 #ifndef __DSTRING_H #define __DSTRING_H #endif #include <stddef.h> class DStri ...

  2. c++拷贝构造和编译优化

    #include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); My ...

  3. C++ 构造函数、析构函数、拷贝构造、赋值运算符

    之所以要把它们放在一起,是因为在使用C/C++类语言的时候,很容易混淆这几个概念(对Java来说完全没有这样的问题,表示Javaor完全没有压力). 先建立一个测试类(包含.h和.cpp) //~ P ...

  4. c++ 拷贝构造练习

    #include<iostream> using namespace std; class Vector { private: int *dwp; int size; void clone ...

  5. C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)

    1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省 ...

  6. C++对象的构造、析构与拷贝构造

    今天下午在研究虚函数的时候遇到了一个问题,觉得很有意思,记录一下. 先看代码: class Base { public: Base(int value) { m_nValue = value; cou ...

  7. 重点:QObject 的拷贝构造和赋值操作——私有

    QObject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承 ...

  8. C++ 进阶5 拷贝构造 深度复制 运算符重载

    C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * *  Created on: 2013年10月26日 *      ...

  9. 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)

    十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...

随机推荐

  1. JAVASCRIPT 浏览器兼容性问题及解决方案列表

    JAVASCRIPT 浏览器兼容性问题及解决方案列表(1)获取HTML元素只兼容IE:document.all.hello hello 兼容所有: document.getElementById(“h ...

  2. sqlalchemy 判断字段是否存在

    1.low方法: (1)person_obj=session.query(Person).filter(Person.name=='jack') print (person_obj.count()) ...

  3. Laravel5.1 表单验证

    当我们提交表单时 通常会对提交过来的数据进行一些验证.Laravel在Controller类中使用了一个traint:ValidatesRequest.方便我们在控制器中使用验证器. 下面我们就来看一 ...

  4. Django学习笔记第五篇--实战练习一--查询数据库并操作cookie

    一.启动项目: django-admin start mysite1 cd mysite1 python manage.py startapp loginapp 根据上文敲命令就可以创建好了一个项目结 ...

  5. angular 2+ innerHTML属性中内联样式丢失

    通过属性绑定的innerHTML,把字符串里面的html解析 解析是没问题的,但一些内联样式会丢失掉 为了不丢掉样式,需要自定义一个管道来解决这个问题 html.pipe.ts import {Pip ...

  6. angular 4 路由变化的时候实时监测刷新组件

    当路由变化的时候刷新组件 比如说要刷新header组件 在header.ts里 import {Router, NavigationEnd} from "@angular/router&qu ...

  7. 160601、Websocet服务端实现

    今天是六一儿童节,祝愿小朋友们节日快乐!大朋友们事事顺心! Websocet服务端实现 WebSocketConfig.Java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  8. 160509、Java过滤器与SpringMVC拦截器之间的关系与区别

    今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深 ...

  9. 分享:宽恕的艺术 Forgive

    宽恕的艺术 To forgive may be divine, but no one ever said it was easy. 宽恕是神圣的,但是没有人说很容易做到宽恕别人. When someo ...

  10. greenplum-cc-web4.0监控安装

    简介: 本文是基于greenplum5.7,greenplum-cc-web4.0安装的. 一.安装greenplum监控的数据库以及创建用户(在gpadmin用户下安装) 1.开启greenplum ...