C++必备基础知识和编程规范

C语言是面向过程的程序设计,强调程序的执行顺序,自上而下,而C++是面向对象的程序设计,将程序看做多个对象组成,每个对象有自己的属性(变量)和行为(函数)。

2.属性是描述对象特征的数据,行为是对象能进行的操作,如英雄联盟里每一个英雄都有自己的属性(生命值,法力值,防御力,攻击力)和行为(普通攻击,施放技能QWER)。

C++编程规范:

类名第一个单词大写,数据成员和变量小写;

成员函数第二个单词首字母大写;

成员函数类外定义,类内声明;

Set和构造函数的参数与数据同名,用this访问;

一、什么是类和对象

1.类(具有共性的实体)其实是C语言结构体的升级版,对象在程序中可以理解为编译器为之分配了存储空间的变量。

假如定义了一个带函数的结构体,然后把struct 改成class

class Stu

{

int id;

char *name;

void study()

{

cout<<name<<"正在学习C++"<<endl;

}

};

在这里class Stu就是类,用这个类定义一个变量Stu czy; czy就是对象

可以对对象进行操作如 czy.id =1;czy.study();

在C++中后缀为*.cpp,编译器用g++,包含头文件#include<iostream>

输入输出用cin,cout,需使用命名空间using namespace std;

2.命名空间用于解决命名重复问题,自定义作用域将多个变量和函数封装起来,如:

namespace myName

{

int num = 10;

void fun()

{

std::cout<<"in mynamespace fun\n";

}

}

然后在main函数中引用, myName::fun();

3.I/O流 cin>> 和cout<< ,就是C语言中的printf()和scanf()但是不用指定格式,cin输入数据类型不匹配时不读取,多个输入之间以空格分隔,遇到空格时结束,不检查数据长度,有缓冲区溢出的危险。所以有了cin.getline(str, sizeof(str)),类似于c语言的fgets();

4.C++中结构名可以直接作为类型名(自动typedef),与C语言不同,c++中const修饰的值为常量,存在文字常量区。

5.缺省函数

带有缺省参数的函数,如void fun(int num = 0);

6.重载函数

允许有同名的函数出现,但是参数不同,返回值不能作为区分的标志,不能与缺省函数同名。

7.类型转换

char a = char(num);

char *p = char *(num);

8.new/delete运算符

还记得C语言中的malloc和free吧,C语言中free释放后,指针和空间都还在,但是指针已经没有了对空间的操作权(好像还能读取),所以应该使其指向NULL

new和delete不是函数是运算符

int num = 10;//栈区定义一个变量

如int *p = new int(100);//在堆区开辟了一块4个字节的空间,里面存了一个int型的数100

而char *str = new char[100];//在堆区开辟了一块100个字节的空间,首地址赋给str

注意new int(100) 和new char[100]的区别(坑)。

new申请的空间自动赋值为0

删除单个变量空间delete num;,删除数组空间delete []str;

9.引用

操作符 &,代替指针,给变量取个别名,引用不占空间

int num = 10;

int &a = num;//定义一个num的别名a

引用必须赋初值,定义后不能修改。

可作为参数和返回值,提高程序的执行效率。

10.C++有封装性,增加了对成员的访问权限

private只能在类中访问,public类中类外都能访问,class类的成员默认为private

还是那个类

class Stu

{

private://这一行开始之后的所有成员都是私有成员

int id;

char *name;

public://这一行开始之后的所有成员都是公有成员

void study()

{

cout<<name<<"正在学习C++"<<endl;

}

};

规范1:C++中一般将属性设置为private, 操作设置为public,然后每一个属性都有相应的操作,如setId(),getId(), setName(), getName()好像面向对象编程都是这个套路

规范2:成员函数一般放在类外定义,类内声明,定义时加 类名:: 指定

如void Stu::setId(int num)

11.构造函数

特殊的成员函数,用于在定义对象时进行初始化

构造函数名称和类相同,可以有参也可以无参,没有返回值(包括void),由编译器自动调用。

如果没有自定义构造函数则使用默认的构造函数(空函数),构造函数可重载,可缺省。

使用new定义对象时也会调用构造函数Stu *s2 = new Stu();

12.析构函数

构造函数的反操作,在删除对象或对象退出生命周期时完成反初始化操作,如清理内存

在构造函数前加~号,一般情况下析构函数由编译器执行,使用delete时会触发调用

一般情况下不需要定义析构函数(没有为类中的成员开辟堆区内存)

如在构造函数中有

Stu()

{

name = new char[100];

}

则必须用析构函数

~Stu()

{

if(NULL != name)

{

delete []name;

name = NULL;

}

}

每个类只有一个析构函数,不能重载也不能有参数

13.拷贝构造函数

特殊的构造函数,定义对象时使用已存在对象完成初始化

名称与类相同,无返回值,参数必须是当前类的对象的引用

使用条件:写Stu s2 = s1;和Stu s3(s1);时会调用拷贝构造函数,而写Stu s2 ; s2 = s1;则不会调用拷贝构造函数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/95c769edeb9e6abb4b0c5852070cdcde.html