IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++:线上课程1_6(const构造函数和析构函数) -> 正文阅读

[C++知识库]C++:线上课程1_6(const构造函数和析构函数)

1.const指针

int a = 10, b = 20;

int* p1 = &a;
const int* p2 = &a;//*p2=100(error) p2=&b;(true) 不可以改变指针指向值,但是可以改变指针自身值
int const* p3 = &a;

int* const p4 = &a;//*p4=100;(true) p3=&b;(error) 可以改变指针指向的值,但是不能修改指针自身值

const int* const p5 = &a;//*p5=100;(error) p5=&b;(error)不可以改变指针指向值,也不可以改变指针自身值
int a = 10, b = 20;

const int* p = &a;

int* s0 = p;//编译错误
const int* s1 = p;
int* const s2 = p;//编译错误,const修饰s2,s2的值不能改变,*s2的值可以改变
const int* const s3 = p;
int a = 10, b = 20;

int* const p = &a;

int* s0 = p;
const int* s1 = p;
int* const s2 = p;
const int* const s3 = p;

2.this指针
(1)上图的系统为每一个对象分配了全套的内存,包括安放成员数据的数据区和安放成员函数的代码区。但是区别同一个类所实例化的对象,是由属性(数据成员)的值决定,不同对象的数据成员的内容是不一样的;而行为(操作)是用函数来描述的,这些操作的代码对所有的对象都是一样的。
(2)编译器对类型的编译:① 对类型进行编译过程中首先是别数据成员,将属性成员记录 ② 函数原型识别 ③ 改写:将成员函数进行改写时候在参数列表里面加上this指针,成员函数函数声明的参数列表加this指针,属性名称一样的记得要加this指针,设计类型,设计成员函数。
(3)所有this指针前面系统都加了const,函数调动之后,this指针消失,this指针在成员函数里面,不在对象里面,常对象只能调动常方法,普通对象既能调动普通方法,也能调动常方法
(4)函数调用约定:this调用
this指针存放于ecx,this指针地址存放于ecx,到达函数内部,把ecx的值存放于this指针
_cdecl是c和c++程序的缺省方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用stdcall函数的大。函数采用从右到左的压栈方式。vc将函数编译后会在函数名前面加上下划线前缀,是mfc缺省调用约定。
fastcall调用约定是“人如其名”,它的主要特点就是快,因为它是通过寄存器来传送参数的。
thiscall仅应用于”c++"成员函数。this指针存放于ecx寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定
3.构造函数和析构函数
3.1构造函数
(1)构造函数:数据成员多为私有的,要对它们进行初始化,必须用一个共有函数来进行。同时这个函数应该在且在定义对象时自动执行一次,称为构造函数。
(2)构造函数用途:① 创建对象 ② 初始化对象中的属性 ③类型转换
(3)构造函数的定义与使用
构造函数是特殊的公有成员函数(在特殊用途中构造函数的访问限定可以定义成私有或保护) ,其特征如下:
① 函数名与类名相同。
② 构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可写void。实际上构造函数有返回值,返回的就是构造函数所创建的对象。
③ 在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象生存期中也只调用这一次。(系统内调动,调动一次)
④ 构造函数可以重载。严格地讲,类中可以定义多个构造函数,它们由不同的参数表区分系统在自动调用时按一般函数重载的规则选一个执行。
⑤ 构造函数可以在类中定义,也可以在类中声明,在类外定义。
⑥ 如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数:
类名(void){ }
但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个,对象不能调动构造函数。
空间:系统分配产生,有空间不一定有对象,空间是由于调用构造函数构建对象。
3.2析构函数
(1)定义:当定义一个对象时,C++ 自动调用构造函数建立该对象并进行初始化,那么当一个对象的生命周期结束时,C++也会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数即析构函数(destructor) :
(1)构函数名与类名相同,但在前面加上字符~。如: ~CGoods ()。
(2)析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数。
(3)一个类有一个也只有一个析构函数,这与构造函数不同。
(4)对象注销时,系统自动调用析构函数。
(5)如果类说明中没有给出析构函数,则C+ +编译器自动给出一个缺省的析构函数。如: ~类名 (){}

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

class Pointer
{
private:
	int row;
	int col;
public:
	Pointer(int r,int c)
	{
		row=r;
		col=c;
	}
	~Pointer()
	{
		cout<<"~Pointer"<<endl;
	}
};

Pointer g_pt(12,23);//全局对象.data;
int main()
{
	Pointer p1(100,200);//局部对象.stack;
	Pointer* p=NULL;
	p=new Pointer(10,20);//new(malloc从堆区申请空间,构建对象,把地址空间返回给p)
	Pointer* s=(Pointer*)malloc(sizeof(Pointer));
	
}
/*int main()
{
	Pointer c1(12,23);
	Pointer c2;

	c1.~Pointer();
	return 0;
}*/
class Object
{
private:
	int val;
public:
	Object(int x)
	{
		val=x;
		cout<<"Create"<<val<<endl;
	}
};
Object ObjA(1);
int main()
{
	Object ObjB(2);
}
Object ObjC(3);

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:10:05  更:2022-02-28 15:12:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:14:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码