C++之旅:拷贝构造与友元
拷贝构造与友元
拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象;友元可以让一个类的所有属性(主要是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++之旅:拷贝构造与友元的更多相关文章
- C++拷贝构造&操作符重载
头文件 DString.h如下 #ifndef __DSTRING_H #define __DSTRING_H #endif #include <stddef.h> class DStri ...
- c++拷贝构造和编译优化
#include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); My ...
- C++ 构造函数、析构函数、拷贝构造、赋值运算符
之所以要把它们放在一起,是因为在使用C/C++类语言的时候,很容易混淆这几个概念(对Java来说完全没有这样的问题,表示Javaor完全没有压力). 先建立一个测试类(包含.h和.cpp) //~ P ...
- c++ 拷贝构造练习
#include<iostream> using namespace std; class Vector { private: int *dwp; int size; void clone ...
- C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)
1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省 ...
- C++对象的构造、析构与拷贝构造
今天下午在研究虚函数的时候遇到了一个问题,觉得很有意思,记录一下. 先看代码: class Base { public: Base(int value) { m_nValue = value; cou ...
- 重点:QObject 的拷贝构造和赋值操作——私有
QObject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承 ...
- C++ 进阶5 拷贝构造 深度复制 运算符重载
C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * * Created on: 2013年10月26日 * ...
- 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)
十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...
随机推荐
- WinError 5
IDE工具:pychrm 语言:python 在使用os模块修改路径名称时,总是会报 WinError 5 这个错误,就是拒绝访问,之前也遇见过,就是要操作的当前路径里有文件已经打开,代码不能再次访问 ...
- 论坛模块_版块管理_增删改查&实现上下移动
论坛模块_版块管理1_增删改查 设计实体Forum.java public class Forum { private Long id; private String name; private St ...
- 如何优化JAVA代码及提高执行效率
可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代 ...
- 第一次广搜!HDU1548--A Strange Lift
一上来看见题目就用了深搜(因为只会深搜)果断内存超限(据说时间也会超限)无奈只好开始用广搜 其实广搜的思路和深搜有很多类似的地方 不过实现的过程中用到了队列 因此有点难以理解(好吧我个人认为) 这题是 ...
- 三 Android Studio打包EgretApp (SDK选择和下载)
一 设置项目的sdk路径 二 设置项目使用sdk版本 一 设置项目的sdk路径 设置SDK目录 选择你电脑上的sdk路径 二 在项目中设置SDK版本 在项目中设置编译的sdk版本 在SDK Manag ...
- 关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市
承蒙广大读者的厚爱我的 <iOS实战:入门与提高卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11766718.html ...
- SpringCloud--注册中心Eureka
Eureka的服务治理设计中,所有节点即是服务提供方,也是服务消费方. Eureka Server的高可用:就是将自己作为服务向其他服务注册中心注册自己,形成一组互相注册的服务注册中心,实现服务清单的 ...
- jQuery Mobile 总结
转载 孟祥月 博客 http://blog.cshttp://blog.csdn.net/mengxiangyue/article/category/1313478/2dn.http://blog. ...
- Hibernate中的映射关系(一对多)
在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique= ...
- Windows MFC 打开文本
MFC的CFileDialog自动封装了文件相关的对话框,提供一种简单的文件打开和文件存盘对话框功能. 要使用CFileDialog类,首先要构造一个对象, 项目实例: CFileDialog fil ...