C/C++查缺补漏:关键字、类(面向对象)

前言

  • 本文记录一些在学习c/c++时常遇到的且一直不是很清晰的问题。

指针运算

  • 这一块一直不是特别清晰,这里做笔记
int* p=0x0;


//p=p+1
//会根据指针变量类型确定步长
//例如int类型的长度是4 bytes
//p++时指针p会前进一个int类型的步长

p++;//p=0x4


//若只想前进一个byte的步长,
//需要先强制转换p的类型为大小为1 byte的类型的指针

p=(int*)((char*)p+1);//p=0x1

引用

  • 引用不是原变量的一份克隆,它就是原变量,只不过是换了个名字
  • 在引用上的所有更改都会直接影响原变量
  • 引用在声明的同时必须被变量初始化,不能被常量初始化
int a=10;
int& b=a;


//传引用的方式
//则函数形参获取的就是传入的实参
//对形参的改变会直接影响实参

void test(int& a)
{
   ...}

int main()
{
   
	int a=10;
	test(a);
}

C++ struct class的区别

  • c++中的struct不仅向c的struct兼容(同样支持结构体中的内存对其),还向class扩展功能。c++中的struct和class 唯一的区别在于struct的默认访问权限是public,class的默认访问权限是private

static关键字

  • static关键字主要用于指定entity的生存周期:变量定义直至程序结束
  • 一个static变量只会被定义一次,之后就是对该entity的访问。对static变量的二次定义是非法的。
  • static关键字只在声明时使用,实际定义时无需static修饰

class中的static成员变量

  • 不能在任何函数中定义,只能以全局变量的方式定义。
  • 不能用对象定义,只能以Test::variable的方式定义。
  • 不与任何对象绑定 只和对应类绑定,对于一个类而言,它的所有对象访问的static成员变量都是相同的。即一个static成员变量在所有同类对象中共享相同副本。
  • 不能被对象初始化(定义),但可以被对象操作,static成员变量无法被constructor初始化,故一般将对其的定义和初始化操作放在类体之外。
  • 与访问权限等其它属性互不影响

class中的static成员函数

  • 可以在类内定义
  • 不具有this指针,不能通过this指针访问变量(this指针是和对象绑定,而static成员函数只和类绑定
  • 不能访问非static成员
  • 只能在声明中用static修饰,若定义和声明分离,则定义不能用static修饰

extern关键字

  • From 《C++ Primer》第五版:. To use a variable in more than one file requires declarations that are separate from the variable’s definition. To use the same variable in multiple files, we must define that variable in one—and only one—file. Other files that use that variable must declare—but not define—that variable.
  • extern变量指定该变量是声明,且其定义在其它文件中。多个文件中试图使用某个文件中的变量时,在使用之前需要在文件内用extern声明后使用
  • 函数默认带有extern属性,无需extern修饰

extern关键字修饰变量时,在头文件内也需要添加

inline关键字

  • 若一个函数被声明为inline(内联)函数,则编译器会将该函数体的内容替换代码中的函数调用部分。这么做可以减少函数调用的时间开销(例如保存现场、数据压栈和出栈、PC跳转等),但会增加代码大小。
  • 一般编译器会根据优化情况来选择是否内联用inline标示的函数。

const关键字

指针常量与常量指针

  • 常量(的)指针:int const* p = &a;const int* p = &a;,不可以通过该指针来修改指针指向的内存,但若a本身在声明时不是以const来声明的,则可以通过其它方式(如直接操控变量)的方式来修改a。
    • 记忆方式:const距离int比距离p更进
  • 指针(是)常量:int* const p = &a;,除了定义(初始化)时,不可以修改p本身。
    • 记忆方式:同上

常量成员函数

  • 常量成员函数:void Test::test() const{...}其内部不能修改任何成员变量。一般对getValue()类型的函数使用常量成员函数来修饰。
  • 常量成员函数在声明和定义时都需要用const来修饰。
  • 非类内成员函数不能是常量函数

这里不介绍常量返回值函数。不知道有什么用。

虚函数与动态绑定(dynamic binding)

两者是同时存在的,只要一者不存在另外一者都无法实现

  • 动态绑定:也称为运行时绑定,即base class类型的引用和指针在运行时与真正的类型进行绑定(可能是derived class)
  • 虚函数:base class的某些函数被derived class覆盖。这样的函数只有在base class被virtual声明才会发生动态绑定。
  • 使用base class引用或指针来调用derived class的成员虚函数发生动态绑定。
  • 多态的实现:虚函数+base class的引用或指针+动态绑定(运行时绑定,在运行时对base class的引用或指针进行解析,获取真实的对象类型)

例如:

class a
{
   
public:
	virtual void test()
	{
   
		cout << 3;
	}
};

class b: public a
{
   
public:
	void test
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值