拷贝构造与友元

拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象;友元可以让一个类的所有属性(主要是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. WebGL中的OpenGL着色器语言

    在webgl中,调用了OpenGL-ES-2.0的API,而在OpenGL-ES专为嵌入式设备设计,其和其它设备一样,都是使用GLSL(GL Shading Language)来编写片段程序并执行于G ...

  2. Docker容器技术(目录)

    Docker介绍和部署请自行搜索官方网站 [01]Docker学习:镜像管理 [02]Docker学习:容器管理 [03]Docker学习:网络管理 [04]Docker学习:Dockerfile [ ...

  3. Java多线程实现自然同步(内含演示案例)

    1.准备一个生产者类: public class Producer extends Thread{ private String name; private Market mkt; static in ...

  4. 移动App如何实践单点登录

    移动应用实现单点登录,分析下面两种需求: 需求一: 账号在正在设备A上使用(应用是设备A上当前活动应用),  若设备B上用该账号登录应用,要求设备A上的账号立即退出. 解决办法: 应用客户端上做个定时 ...

  5. spring-boot Web集群

    SpringBoot启动类增加注解 @EnableRedisHttpSession @SpringBootApplication @ImportResource({"classpath:co ...

  6. spring-boot 打包成 war包发布

    1.用maven打包成war包 2.将war包用zip方式打开,删除里面的tomcat-embed相关的4个包,删除spring-boot-tomcat包 3.将删除了tomcat相关嵌入包后的war ...

  7. 制作item和category的mvc视图总结

    View层index.phg 代码: <?php use yii\helpers\Html; use yii\grid\GridView; use yii\widgets\Pjax; use f ...

  8. Bootstrap学习记录

    中文官网 Bootstrap 插件 Bootstrap Multiselect bootstrap-multiselect 的简单使用,样式修改,动态创建option JS组件系列——Bootstra ...

  9. MySQL 监控指标

    为了排查问题,对数据库的监控是必不可少的,在此介绍下 MySQL 中的常用监控指标. 简介 MySQL 有多个分支版本,常见的有 MySQL.Percona.MariaDB,各个版本所对应的监控项也会 ...

  10. Static Import Constant interface

    Static Import https://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html In order t ...