设为首页 加入收藏

TOP

C++必备基础知识和编程规范(一)
2018-10-28 16:08:24 】 浏览:300
Tags:必备 基础知识 编程 规范

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;则不会调用拷贝构造函数。


一般情况下不需要自定义拷贝构造函数(和析构函数一样没有为类中的成员开辟堆区内存),因为如果不定义拷贝函数编译器只会进行浅拷贝操作(只拷贝值,不拷贝内存空间),释放时会出现段错误


所以当类中有指针且为指针分配了空间时,要自定义拷贝构造函数进行深拷贝。


Stu(const Stu &s1)


{


 id = s1.id;


 name = new char[strlen(s1.name)+1];


 strcpy(name, s1.name);


}


类中有动态内存分配时,需要自定义拷贝构造函数,否则会因为多次释放同一段内存导致段错误(double free or corruption)


14.const 修饰的成员函数


void setId(int num)const


{


}


称为只读成员函数,只能读取成员值,不能修改(除非是mutable int id)


15.对象数组:有限个相同类型的对象构成的集合


Stu array[3]={Stu(1), Stu(2)};


16.this指针


一个隐藏的指针变量,是成员函数的第一个参数,类型为对象的类型


首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++中的函数及参数介绍 下一篇C语言实现的哈希表

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目