概述
程序产物的存储
产物 就是数据和指令
存储 就是执行文件和运行
数据 : 全局量 静态量
指令:数据以外全部是指令
执行文件中:
数据: .data .bss
指令: .text
编译的过程中
.rodata : 可以看作数据段
存储的是常量 — “aaaa” (不可以改变的:字符串常量)
继承和多态中的vftable RTTI结构 也是存储在.rodata
.data:
存储的是有初始化,且初始化不为0的数据
.bss:
存储的是没有初始化(值依然是0) 或者 初始化为0的数据
在文件中.bss段不占空间(全部是0)
符号表: 存储的是符号,符号相当于给某个内存取个名字。
数据都会产生符号
函数名会产生符号
#include<studio.h>
//头文件放的是函数的声明,在预编译就展开了,编译之后就不存在了
#define A 10 //宏在预编译之后就没有了
int a; //是数据
static int b //是数据
void fun() //函数或者函数体是指令
{}
int main() ///是指令
{
static int c; //是数据
int d = A;
……
}
那么在运行的时候
数据存储在虚拟地址空间
.data:
有初始化且初始化不为0的数据
.bss:
没有初始化或者初始化为0的数据
.text:
存储指令
.rodata:
常量 — “aaaa”
vftable RTTI结构
虚拟地址空间从可执行文件中读取数据依赖的是 可执行文件中的load页
运行需要的内存
stack: 栈 (函数的栈帧)
函数栈帧 — 在函数中定义的局部量
heap:堆
动态空间 — malloc free new delete
struct 和 class的区别
c语言中使用struct定义结构体
在c++中使用struct或者class定义类
c语言中 struct里面不能定义成员方法和访问权限
c++中 struct可以定义成员方法和访问权限
c++中 struct默认权限为public
c语言中 struct最小内存可以为0,c++中最小是1
c++中 class可以用来写模板,但是struct不可以用来写模板
C++和C相互调用
c语言产生的函数符号依赖的是函数名
c++中产生函数符号依赖的是函数名+参数列表
c语言中引用c++:
以上这个做法,在cpp中调用时无法找到b.c的fun_c函数。
我们需要引入extern
c++中引用C语言:
在c++中声明C语言函数时候,加上extern"C"
c语言中引用c++:
新写一个cpp(aa.cpp),然后使用extern
c和c+中const的区别
左值 :
int a; 可以放在等号左边的量,a就是左值
右值 :
const int a; 10 像a和10都不可以放在等号左边的量,不允许被赋值或者修改
常量:
10 20 ‘a’ 不可能改变的量,常量是没有地址的
常量字符串:
“aaaa”
const char* p = “aaa”;
常变量:
不可以作为左值,有地址
C语言中const
修饰的是常变量
const int a = 10;
a = 20;//是错误的
const int *p =&a;
*((int*)p) = 20;
cout<<a<<endl;//20
常量:c++中
int c= 20;
const int a = c ;
int b = a;
const int *p = &a;
*((int*)p) = 20;
cout<<*p<<endl;//20
cout<<a<<endl;//10
注意:编译期间就会将所有使用的a的地方替换为a的值
c++中的cosnt修饰的量必须初始化!!!
常量必须使用常量初始化 ,不能用变量去初始化常量。
c++中的常变量:
c++ 中如果使用变量初始化const修饰的量,const修饰的量就会退化为常量。
C++的引用
int a = 10;
int &aa = a ;
aa = 20;
int c = aa;
引用相当于是别名
引用的底层其实是 指针
引用在使用到该引用的地方,在编译期间会自动替换为指针的解引用
所以引用一旦初始化,就无法改变引用的指向
所以引用必须初始化
引用和指针的区别:
引用底层就是指针
引用在使用到该引用的地方,在编译期间会自动替换为指针的解引用
引用相对于指针更方便使用
引用无法改变引用的对象
inline内联函数
只是建议系统将该函数处理成内联
递归函数无法处理成内联
宏函数:
会在调用点展开----预编译期
作用域只在本文件
不产生符号
不可以调试
没有类型判断
内联:
在release版本中会在调用点展开 — 编译期间展开
作用域只在本文件
release版本中不产生符号,debug版本产生local符号
在debug版本可以调试
有类型判断
static:
不展开
作用域只在本文件
产生local符号
可以调试
有类型判断
c++中哪些替代了c语言中的宏的使用
文本替代宏
#define AAA 10 ---- 预编译期间进行文本替换
const ----- 编译期进行值替换,比文本替换更安全
宏函数 ---- 预编译期间进行文本替换
内联函数替代 ---- 编译期间进行逻辑替换
面向对象
三大特征:封装 继承 多态
四大特征:抽象 封装 继承 多态
构造函数:
构造函数是在对象实例化的时候调用的成员方法
如果没有自己实现构造函数,系统会自动产生一个默认构造函数,这个函数什么都不做
如果自己实现了构造函数,系统就不会在生成默认构造了
构造函数可以存在多个,参数列表不同即可,相互之间存在重载关系
拷贝构造函数:
拷贝构造函数是在使用已存在的对象生成新对象的过程中调用的成员方法
如果没有自己实现拷贝构造函数,系统会自动产生一个拷贝构造函数,这个拷贝构造函数是浅拷贝
如果自己实现了拷贝构造函数,系统就不会再生成了
拷贝构造函数只有一个
注意:
1.参数必须传引用-------防止参数传递死递归(如果不传引用就是拷贝构造死递归)
2.防止浅拷贝
析构函数
析构函数是在对象生存周期满的时候自动调用的成员方法
如果没有实现,系统会默认生成一个,但是生成的析构函数啥都不做
自己实现了,系统就不会生成了
注意:
防止内存泄漏
=运算符重载
在使用已存在的对象给已存在的对象赋值过程中自动调用的
如果没有实现,系统会自动生成一个浅拷贝的=运算符重载
自己实现了就不会生成了
注意:
防止自赋值
防止内存泄漏
防止浅拷贝
new delete 是运算符
new:
new operator : 一般使用的(不能重载)
做的两件事情—》operator new(申请内存) —》调用构造
operator new : 允许重载的 —用来申请内存
delete :
delete operator: 一般使用的(不能重载)
做的两件事情—》调用析构 ----》释放内存(operator delete)
operator delete:允许重载 ----- 用来释放内存
this指针
指向源对象自身的指针
在非静态成员方法的形参列表第一个位置,默认加上this指针,编译期间生成指令时候加上的
在调用的非静态成员方法的实参列表第一个位置,默认加上this指针,编译期间生成指令时候加上的
在非静态成员方法体内,使用到非静态成员的地方,默认加上this->,编译期间生成指令时候加上的
成员方法内无法改变this指针的指向,所以参数中的是
SUB * const this
this = NULL;是error的!!!
const方法
在成员方法的参数列表后面加上const
void fun()const{}
这个const修饰的是this指针
const SUB* const this
const成员方法中不允许改变该对象成员
this->a = 10;///error!!!
常对象只能使用常方法—
因为常对象的this指针是常指针
常方法当中也只能使用常方法
建议:
成员方法中如果没有改变对象的成员就将该方法写成常方法
最后
以上就是执着嚓茶为你收集整理的343-C++复习(1)的全部内容,希望文章能够帮你解决343-C++复习(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复