构造函数,析构函数,拷贝构造函数

//堆区开辟中new/delete才会调用构造函数与析构函数, malloc/free不调用构造函数与析构函数
#include <iostream>using namespace std;class Student {public:char * name;int age;// : Student("kevin", 55)  相当于转接调用两个参数的构造函数Student() : Student("kevin", 55){cout << "无参构造" << endl;}//name(name) 等价于 this->name = name;Student(char *name) : name(name){cout << "一个参数的构造" << endl;}Student(char *name, int age) : name(name), age(age){cout << "两个参数的构造" << endl;}//析构函数,对象释放时执行(比如构造中若开辟了堆区内存,析构函数需要把堆区内存释放)~Student() {cout << "析构函数" << endl;}//自定义覆盖系统拷贝构造函数,const Student & st表示传入参数只读Student(const Student & st) {cout << "拷贝构造函数" << endl;
//        this->name = st.name;
//        this->age = st.age;this->name = "sss";this->age = 100;}
};int main() {//栈区Student s1;//两个参数的构造 —> 无参构造Student s2("li", 30);//=执行拷贝构造函数,对象会有默认的拷贝构造函数s2 = s1;cout << s2.name << s2.age << endl;//只有声明拷贝才会走自定义的拷贝构造函数Student s3 = s1;cout << s3.name << s3.age << endl;//堆区Student * s = new Student("li");if (s) {delete s;s = NULL;}return 0;
}

static静态关键字

#include <iostream>using namespace std;class Student {
public://类中静态属性先声明后在类外初始化static int age;static int getAge() {return age;}
};//静态属性初始化(必须初始化)
int Student::age = 10;int main() {//类名 :: 调用静态属性和静态方法cout << Student::age << endl;cout << Student::getAge() << endl;return 0;
}

对象中this和const关键字关系

//默认构造方法中会在栈区开辟空间对外暴露指针this
//this另外有隐式的const修饰:Student * const this(【类型 * const this】),即指针常量。
//因此,this指针可以修改所对应的值,而无法修改指针地址,即set方法可以实现,但this = 0x1000会编译报错
//get方法后加上const则会将此时的this变成 const Student * const,即常量指针常量。
//因此get方法中是无法修改this指针所对应的值的
class Student {
private:char * name;int age;
public:void setName(char * name) {this->name = name;}void setAge(int age) {this->age = age;}char * getName() const {return this->name;}int getAge() const {return this->age;}
};

友元函数和友元类

#include <iostream>using namespace std;class Person {
private:int age = 15;//友元函数(类中声明,外面实现)friend int getAge(Person * person);friend void changeAge(Person * person, int newAge);//友元类(指向一个类使其可以访问自己的私有成员)friend class YouY;
};//被指定的友元类可以访问所有私有成员
class YouY {
public:Person person;int getPersonAge() {return person.age;}
};//实现的友元函数可以访问其私有成员
int getAge(Person * person){return person->age;
}
void changeAge(Person * person, int newAge){person->age = newAge;
}int main() {Person person;cout << getAge(&person) << endl;YouY you;cout << you.getPersonAge() << endl;changeAge(&you.person, 55);cout << you.getPersonAge() << endl;return 0;
}

函数用法小结

//函数头文件定义(Book.h)
#include <iostream>using namespace std;//判断定义宏
#ifndef DEMO4_BOOK_H
#define DEMO4_BOOK_Hclass Book {
private:char * name;
public:// 静态成员声明static int id;// 构造函数声明Book();Book(char *);// 析构函数声明~Book();// 拷贝构造函数声明Book(const Book & book);// 普通函数声明char * getName() const;void setName(char *);// 静态函数声明static void changeId(int);// 友元函数的声明friend void changeName(Book * book, char * name);
};//关闭宏
#endif
//头文件实现(Book.cpp)
#include "Book.h"// 实现构造函数
Book::Book() {cout << "默认构造函数" << endl;
}
Book::Book(char * name) {cout << "1个参数构造函数" << endl;
}
// 实现析构函数
Book::~Book() {cout << "析构函数" << endl;
}
// 实现拷贝构造函数
Book::Book(const Book &book) {cout << "拷贝构造函数" << endl;
}
// 实现普通函数
char * Book::getName() const{return this->name;
}
void Book::setName(char * name) {this->name = name;
}// 初始化静态属性【不需要增加 static关键字】
int Book::id = 878;
// 实现静态函数,【不需要增加 static关键字】
void Book::changeId(int id) {Book::id = id;
}
// 友元的实现
// 友元特殊:不需要关键字,也不需要 对象:: ,只需要保证 函数名(参数)
void changeName(Book * book, char * name) {book->name = name;
}

C++语言涉猎笔记(二)相关推荐

  1. c++语言自定义操作符,C++语言复习笔记二

    C++语言复习笔记二 零.OOP 特征:抽象-封装-继承-多态 一.自定义数据类型 1.类 class 类名 { private: 私有成员(本类) public: 公共成员(所有) protecte ...

  2. C 语言学习笔记(二):编程基础

    目录 一.冯诺依曼模型 二.程序语言发展历史 三.进制 3.1 二进制 3.2 八进制 3.3 十六进制 3.4 进制转换:二进制.八进制.十六进制.十进制之间的转换 3.4.1 将二进制.八进制.十 ...

  3. Go 语言学习笔记(二):函数

    目录 函数 函数定义 函数签名和匿名函数 defer 闭包 概念 panic 和 recover 函数 函数是程序执行的一个基本语法结构,Go 语言的很多特性是基于函数这个基础实现的,比如命名类型的方 ...

  4. C语言学习笔记(二): 简单的C程序设计

    数据的表现形式 常量 在C语言中常量有以下几种: 整型常量: 0,-1,100 实型常量: 小数形式(12.12):指数形式(12.1e3= 12.1 × 1 0 3 12.1\times 10^3 ...

  5. c语言运算符 %3c%3c4,C语言学习笔记二---数据类型运算符与表达式

    一.C的基本语法单位 1.标识符:有效长度:31(DOS环境下) 2.关键字:main不是 3.分隔符:空格符,制表符,换行符,换页符 4.注释符:a./*.....*/   b.// 二.C的常用输 ...

  6. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  7. 最最最详细的C语言教程笔记零起步(10)进阶必备 同笔者一起学习

    C语言教程笔记 二十二. 输入输出缓存 1. 探究printf的现象 1.1 windows系统上的代码 1.2 linux系统上的代码 1.3 windows系统上的表现 1.4 linux系统上的 ...

  8. 数据结构源码笔记(C语言):二叉平衡树的相关操作算法

    //二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...

  9. Ink脚本语言学习笔记(二)

    目前想要基于Ink脚本语言和Unity新的UIToolkit做一套对话系统,本文对Ink脚本语言的使用方式做一下介绍和总结 Ink脚本语言学习笔记(一) 二.缝合(Weave) 目前没想好怎么翻译这个 ...

最新文章

  1. (Windows Maven项目)Redis数据库的安装和操作实现
  2. Python 相对路径、绝对路径的写法实例演示
  3. php 移动端隐藏引导页,移动端引导设计技巧1:前置的引导页
  4. 华硕xhci灰色_xHCI模式作怪无法使用USB设备?解决办法这里有!
  5. Jzoj4764 Brothers
  6. 用xargs处理带空格文件名
  7. 海报合成_新年元旦创意合成设计之跨年海报!这组海报我打99分!
  8. 机器学习3/100天-多特征线形回归
  9. 递归算法1加到100_「算法」北京大学算法基础—递归(1)
  10. DCN神州数码无线理论与配置逻辑
  11. 路面坑洼检测中的视觉算法
  12. kpi绩效考核流程图_KPI绩效考核如何运作起来(内含企业KPI实例之详解)
  13. C/C++ 二维数组传参方法总结
  14. 微信可以登录,代理服务器没有响应
  15. 银行卡支付之连连支付
  16. STM32CubeIDE 介绍及安装
  17. 连接数据库,写了一个登录注册界面
  18. 青龙面板-花花阅读6.25 最新修复版
  19. 物联卡中心:物联卡实名制安不安全?
  20. 木材加工(LintCode)

热门文章

  1. Python 英文分词
  2. 2021-11-13
  3. 一家企业怎样才算Cool?Gartner告诉你!
  4. python汉字转拼音首字母_python获取一组汉字拼音首字母的方法
  5. 可汗学院学习总结(一)
  6. 新版CorelDRAW Technical Suite2022最新详细功能介绍
  7. FreeRTOS-软件定时器篇
  8. 为什么我选择csdn写blog
  9. 通达信客户端程序化下单
  10. Nginx 配置旧域名重定向到新域名