首页 > 其他分享 >14.拷贝构造函数、静态、友元和预编译头

14.拷贝构造函数、静态、友元和预编译头

时间:2023-06-13 10:22:27浏览次数:48  
标签:友元 14 int num Playeer 拷贝 构造函数 name

  • 拷贝构造函数
  • 静态
  • 友元
  • 预编译头

拷贝构造函数

eg:

Playeer.h代码:

#pragma once

class Playeer
{
private:
    int num;
    char* name;
public:
    Playeer(int x, const char* name); 
    ~Playeer();
    void display();   // 输出结果
    void setX(int x);    // 改变num值
    void setname(const char* name);    // 改变name
};

Playeer.cpp代码:

#include "Playeer.h"
#include <string.h>
#include <iostream>

using namespace std;
Playeer::Playeer(int n, const char* word)   // 构造函数
{
    num = n;
    name = new char[20];
    strcpy_s(name, 20, word);  // 拷贝
}

Playeer::~Playeer() {
    delete[] name;
    name = nullptr;
}

void Playeer::display() {
    cout << name << " " << num << endl;
}

void Playeer::setname(const char* word) {
    strcpy_s(name, 20, word);  // 拷贝
}

void Playeer::setX(int x) {
    num = x;
}

源.cpp代码:

#include "Playeer.h"

int main() {
    Playeer p1(10, "lisi");
    Playeer p2 = p1;
    p1.display();
    p2.display();
    p1.setX(20);
    p1.setname("zhanssan");
    p1.display();
    p2.display();
}

运行结果:

 但是此代码会引起,系统的奔溃,需要引入拷贝构造函数。

语法:

类名(const 类名 & 变量名);

拷贝构造函数的特性:

定义当一个对象初始化另一个对象时调用的不是构造函数,而是拷贝构造函数;

没定义拷贝构造函数时,系统会分配一个默认的拷贝构造函数;

浅拷贝

eg:在Playeer类中加入,拷贝构造函数

Playeer::Playeer(const Playeer& playeer) {
    num = playeer.num;
    name = playeer.name;  // 浅拷贝
}

运行结果为

但程序依旧会奔溃,因为浅拷贝只是简单的改变值,没有影响地址

深拷贝

eg:

Playeer::Playeer(const Playeer& playeer) {
    num = playeer.num;
    //name = playeer.name;  // 浅拷贝
    name = new char[20];
    strcpy_s(this->name, 20, playeer.name);
}

运行结果为:

 使用了深拷贝程序就没有奔溃。

 

静态

类的静态变量

类的静态变量,只会与类的运算一直变化。

语法:

static 变量名

eg:

未使用的静态变量

.h文件的代码

class number
{
    int num=0;
    int id;
public:
    number() {
        num++;
        id = num;}
    void show() {
        cout << "num:" << num << " " << "id:" << id << endl;
    }
};

主程序代码

    number cod,cod2;
    cod.show();
    cod2.show();

使用静态变量的 

修改.h代码

class number
{
     static int num;  // 改为
    int id;
public:
    number() {
        num++;
        id = num;}

    void show() {
        cout << "num:" << num << " " << "id:" << id << endl;
    }
};

修改.cpp文件代码

int number::num = 0;

运行结果

 调用静态变量

如果静态变量在类的公共中,可以直接调用

语法:

类名::变量名;

eg:

    number cod,cod2;
    cod.show();
    cod2.show();
    cout << number::num << endl;  

 

局部静态变量

eg:

int main() {
    int b;
    for (int i = 0; i < 8; i++)
    {
        static int number = 0;
        number++;
        b = number;
    }
    cout << b;
}

运行结果为8

 

友元

在类中使用,可以让其他类和函数直接调用 类中的内容

eg:

class Num
{
public:
    friend void addone(Num a);
    friend class B;
private:
    int data=9;
};

class B
{
public:
    void addtwo(Num a) {
        a.data += 2;
        cout << a.data << endl;
    }
private:
    
};

void addone(Num a) {
    a.data++;
    cout << a.data << endl;
}

int main() {
    B i;
    Num j;
    addone(j);
    i.addtwo(j);
}

 

预编译头文件

预编译头是可以不用重复include头文件的操作

选中项目,右键属性

 打开属性后、点击c/c++---预编译头---预编译头,把不使用预编译头改为创建或使用、后点击应用

 创一个与预编译头文件名相同的.h文件、将需要的include内容,或using namespace代入、先写程序自带的头文件、再写自己创建的类

返回目录

标签:友元,14,int,num,Playeer,拷贝,构造函数,name
From: https://www.cnblogs.com/20wod/p/17468961.html

相关文章

  • 1483. 树节点的第 K 个祖先 又学了一招
    1483.树节点的第K个祖先最开始自己的思路竟然是想构建多叉树,这样实在太蠢了,还是直接学习优秀的官解吧。学习历程暴力解法学习举例说明:n=7parent=[-1,0,0,1,1,2,2]一共七个节点节点的值分别是:0,1,2,3,4,5,6-1:表示根节点ex:寻找节点6的祖先节点第一个祖先节点:parent[6]=2......
  • Codeforces Round #143 (Div. 2)-D. Magic Box
    原题链接D.MagicBoxtimelimitpertestmemorylimitpertestinputoutputOnedayVasyawasgoinghomewhenhesawaboxlyingontheroad.Theboxcanberepresentedasa......
  • 51nod-1460 连接小岛
    原题链接1460 连接小岛题目来源: CodeForces基准时间限制:1.5 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注li+1  对于所有的 1≤i≤n-1。现在要将相邻的小岛用桥连接起来。现在有一条桥的长度是a,第i个......
  • 51nod-1434 区间LCM
    原题链接1434 区间LCM题目来源: TopCoder基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注例如,LCM(2)=2,LCM(4,6)=12,LCM(1,2,3,4,5)=60。现在给定一个整数N(1<=N<=1000000),需要找到......
  • 【Azure 环境】使用az login登录遇见OSError: [WinError -2146893813] : '' 错误
    问题描述使用azlogin指令登录,遇见OSError:[WinError-2146893813]:'',在指令中添加--debug后,输出的错误消息为:urllib3.connectionpool:StartingnewHTTPSconnection(1):*****.******.com:443urllib3.connectionpool:https://****.****.com:443"POST/adfs/ser......
  • ASEMI代理艾赛斯IXFA14N85XHV功率MOSFET综合指南
    编辑-Z在当今世界,电力电子在各种应用中发挥着至关重要的作用,从电源和电机驱动到电动汽车和可再生能源系统。这些应用中的关键部件之一是功率MOSFET(金属氧化物半导体场效应晶体管)。IXFA14N85XHV是一款先进的功率MOSFET,具有高性能、高可靠性和高效率。在本综合指南中,我们将探讨IXFA......
  • BZOJ1461字符串的匹配
    题目具体思路与KMP板子很像;大致思路是将两个数字的排名来当字符比较用树状数组\(log_2(n)\)的复杂度来找排名。一定要注意边界问题具体实现思路可以看代码(PS:有奆佬说这题很板子,也许是我太弱了叭QAQ)//9:30开始写题,有些思路//40思路被pass,不会写了//55决定......
  • 外汇天眼:FINTOCH又传诈骗案! 新竹妇人入金149万领不回
    最近网络爆出多起资金盘诈骗案,除了引发社会大众关注的「imB诈骗案」外,上个月外汇天眼也发布了「投资人注意!FINTOCH“分投趣”遭爆为假借贷资金盘! 」这篇文章,呼吁所有用户小心这个平台,没想到前几天又出现新的受害者。从外汇天眼之前的报道可以知道,FINTOCH借贷理财收益每天报酬率有......
  • POJ 1459 Power Network(最大流)
    题意:第一眼看到这题目觉得神题啊...其实题目给的s[i]压根不用管的....总共有n个结点,其中有发电站np个、用户nc个和调度器n-np-nc个三种节点以及M条电线(用于传输电流的),每个发电站有一个最大发电量,每个用户有个最大接受电量,现在有m条有向边,边有一个最大的电流量,表示最多可以流出这......
  • LightOJ 1422 Halloween Costumes (区间DP)
    题意:你要连续去很多个舞会,给出n个舞会你需要穿的衣服的编号,一旦脱下就不能再穿,但是可以一件套一件,问最少需要准备多少件衣服。思路:区间DP,令dp[i][j]为第i到第j天需要的衣服,那么对于第i天,如果考虑后面没有和它重复的话,那么dp[i][j]=dp[i+1][j]+1,如果存在某一天a[i]==a[k],dp[i][j]=......