博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++基础复习
阅读量:2433 次
发布时间:2019-05-10

本文共 3994 字,大约阅读时间需要 13 分钟。

C++

引用

int add(int &b){b=b+1;return b;}int main(){int a=99;printf("%d\n",add(a));}

构造函数

#include
using namespace std;class Person{private: char *name; int age; char *work;public: Person(){
cout<<"Person()"<
name=name; } Person(char *name,int age,char *work="none"){ cout<<"Person(char *name,int age)"<
name=name; this->age=age; this->work=work; } void printfInfo(void) { cout<<"name="<
<<" age="<
<<" work="<
<
printfInfo(); per8->printfInfo(); delete per4; delete per5; delete []per6; delete per7; delete per8; return 0;}

析构函数

#include
#include
using namespace std;class Person{private: char *name; int age; char *work;public: Person(){
cout<<"Person()"<
work=NULL; this->name=NULL; } Person(char *name){ cout<<"Person(char *name)"<
name=new char[strlen(name)+1]; strcpy(this->name,name); this->work=NULL; } Person(char *name,int age,char *work="none"){ cout<<"Person(char *name,int age)"<
age=age; this->name=new char[strlen(name)+1]; strcpy(this->name,name); this->work=new char[strlen(work)+1]; strcpy(this->work,work); } ~Person() { cout<<"~Person()"<
name) { cout<
name<<"----"<
name; } if(this->work) { delete this->work; } } void printfInfo(void) { cout<<"name="<
<<" age="<
<<" work="<
<
printfInfo(); per8->printfInfo(); delete per4; delete per5; delete []per6; delete per7; delete per8;}

析构函数在对象销毁前的瞬间被调用。

Person *per7=new Person(“ls”,18,”stu”);
delete per7;
new创建的对象,必须用delete函数销毁掉,负责不会调用析构函数。
Person Per(“chenmiaohong”,16);
Person *Per7=new Person(“ls”,18,”stu”);
delete Per7;
调用~Person的顺序为先new对象被释放,接着按构造顺序相反的顺序释放,先创建的后调用析构函数。
这里写图片描述
默认拷贝构造函数
Person per(“zhangsan”,18);
Person per2(per);
调用默认的拷贝构造函数将per的值传递给per2,但是这样引入问题因为per与per2指向内存的同一块地址,当对象被销毁时,都会去释放这块内存。
拷贝构造函数实现

Person(Person &per){        cout<<"(Person &per)"<
age=per.age; this->name=new char[strlen(per.name)+1]; strcpy(this->name,per.name); this->work=new char[strlen(per.work)+1]; strcpy(this->work,per.work); }int main(){ Person per("zhangsan",18); Person per2(per); per2.printfInfo(); return 0;}

类的静态成员

类成员必须通过类的对象来访问,不能通过类名直接访问。如果将类的成员定义为静态成员,则允许使用类名直接访问,静态成员使用static关键字访问

class Person{public:static unsigned int m_Price;//静态数据成员通常需要在类外部进行初始化}unsigned int Person::m_Price=10;在一个类中类的静态数据成员被类中所有的类对象所共享。不论哪个对象对其值进行了修改。其他对象的静态数据成员也会被修改。静态数据成员可以是当前类的类型,而其他数据成员只能是当前类的指针或者应用。class Person{public:static unsigned int m_price;Person per;//非法的定义,不允许在该类中定义所属类的对象static Person per1;//正确,静态数据成员允许定义类的所属类对象Person *per2;//正确,允许定义类的所属类型的指针型对象}静态数据成员可以作为成员函数的默认参数,其他数据成员不可以class Person(){public:static unsigned int m_per;int m_page;void OutputInfo(int data=m_per)//正确,静态数据成员作为函数的默认参数{cout<<

类的静态成员函数只能访问静态数据成员,不能访问非静态数据成员。

static void Outputinfo()const;错误的定义,静态成员函数末尾不能使用const关键字
在类中定义的静态成员函数,在类外实现时不能添加static关键字

对象的构造顺序

构造顺序:按运行中定义对象的顺序调用构造函数,静态对象只调用一次构造函数; 全局对象在main函数执行前被构造

Person per_g("per_g",10);1void fun(){    Person per_func("per_func",11);4    static Person per_func_s("per_func_s",11);5}int main(){    Person per_main("per_main",11);2    static Person per_main_s("per_main_s",11);3    for(int i=0;i<2;i++)    {        fun();        Person per_for("per_for",i);6    }    return 0;}

析构函数调用顺序:

局部普通类对象,主函数内对象,局部static对象,main函数static对象,全局static对象

这里写图片描述

Person(char *name,int age,char *work="none"){        cout<<"Person(char*,int),name="<
<<",age="<
<
age=age; this->name=new char[strlen(name)+1]; strcpy(this->name,name); this->work=new char[strlen(work)+1]; strcpy(this->work,work); }......class Student{private: Person father; Person mother; int stu_id;public : Student() { cout<<"Student()"<

这里写图片描述

构造函数调用顺序是:先调用father、mother、stu
析构函数调用顺序是:先调用stu、mother、father

你可能感兴趣的文章
json相关学习
查看>>
linux下access函数的应用
查看>>
linux系统调用之文件:递归删除非空目录
查看>>
linux下获取系统时间的方法
查看>>
ubuntu12.04安装openCV2.4.6.1
查看>>
jsp与servlet的作用以及区别--为什么说JSP底层就是一个Servlet
查看>>
看HashMap源码前的必备冷知识,白话文式教学,适合刚开始了解源码的新手观看
查看>>
Oracle安装指南
查看>>
Redis面试必备(一)
查看>>
Cookie对象入门详解
查看>>
HashMap的remove()方法详解
查看>>
单例模式-分解步骤,逐步解析
查看>>
通过Form表单一次性拿到json格式数据,及后台接收
查看>>
## EL表达式与JSTL标签用法解读
查看>>
Mybatis异常:The content of elements must consist of well-formed.......(一般出现在写分页/带大于小于号的SQL)
查看>>
Mybatis光速入门(配置文件模块)
查看>>
关于Oracle的主键自增如何设置
查看>>
手撕HashMap的resize()方法源码渗透解析+图解
查看>>
Mybatis常见异常类型Could not set parameters for mapping离不开这个原因!
查看>>
Thymeleaf中一个页面怎么嵌套另一个页面,关于页面嵌套,标签告诉你应该知道的
查看>>