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

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

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

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指针

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

如果对象的成员函数形参和属性相同,可用this指定

用于规范:

void setId(int id)

{

this->id = id;

}

如果要重复调用成员如:s1.setId(10).getId();可使setId()返回对象的引用(return *this)

17.枚举(常与switch使用)

构造函数列表

Stu():id(10), score(99.5)

{

}

使用方法和构造函数相同,但是可以完成特殊成员的初始化如const修饰的成员

18.const修饰的成员

只能用构造函数列表初始化,const修饰的成员在不同的对象中可以有不同的值

19.静态成员 static int num; static int getNum();

静态数据成员和静态成员函数,初始为0

静态数据成员在类外定义,类内声明,和类的其它成员不在一块内存,不占用对象的空间,sizeof()不会计算。

属于整个类而不是某个对象,可通过类名::对象访问Stu::num

作用之一:代替全局变量

静态成员函数不能使用非静态数据成员,只能访问静态数据成员和全局变量, 不能使用this

为了更好地操作使用静态数据成员而出现静态成员函数,在定义对象之前即可操作静态数据成员。

20.对象成员

即类的嵌套,类似结构体嵌套,一个类的对象作为另一个类的成员

给对象成员中的数据成员赋值要用构造函数列表

class A

{

public:

int aNum;

A(){

aNum = 1;

cout<<"在A构造函数中"<<endl;

}

A(int num){

aNum = num;

}

};

class B

{

public:

int bNum;

A a;

B()

{

bNum = 2;

cout<<"在B构造函数中"<<endl;

}

B(int num):a(10)

{

bNum = num;

}

};

21.友元

在类外访问类的私有成员

友元函数,友元成员,友元类

关键字friend

友元函数:将一个类外函数声明为friend,可以访问类的私有成员,友元函数定义有顺序要求

友元成员:一个类的成员函数声明为friend如:friend void Tch::getNum(),另一个类的成员函数可以访问该类成员。

友元类:friend class Tch;

友元一般不使用,因为破坏了函数的封装性

22.运算符重载

也叫运算符重载函数,为适应对象操作

int operator +(A a1, A a2)

{

return a1.num+a2.num;

}

运算符重载实质为函数重载,必须遵循其原则

除了成员运算符".", "sizeof", 条件运算符"?:", 作用域运算符"::"之外都可以重载,重载后优先级和结合性不变

一般重载为友元函数或成员函数

单目运算符重载为成员函数,双目运算符重载为友元函数

"=", "()", "[]", "->"不能重载为友元

原文地址:http://blog.51cto.com/13603157/2103275

时间: 2024-10-08 16:24:29

C++必备基础知识和编程规范的相关文章

Shell基础知识和编程规范

一,Shell环境查看 1.1 查看系统Shell支持情况 [[email protected] ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin 1.2 查看当前系统默认的Shell 方法一 [[email protected] ~]# echo $SHELL /bin/bash 方法二 [[email protected] ~]# grep root

编程必备基础知识|计算机组成原理篇(06):计算机的字符与编码集

计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识.关于计算机基础的课程很多,内容繁杂,但无论是相关书籍还是大学课程,都有点脱离工作.特别地,计算机基础知识体系庞杂,想要从零学习或者复习都耗时耗力. 有鉴于此,本系列文章将带你更快的补足编程必备基础知识,涵盖计算机领域三大基础知识:计算机组成原理.操作系统.计算机网络,这些都是大学计算机课程里面最重要的内容.文章对这些内容做了提炼和

编程必备基础知识|计算机组成原理篇(07):计算机的总线

计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识.关于计算机基础的课程很多,内容繁杂,但无论是相关书籍还是大学课程,都有点脱离工作.特别地,计算机基础知识体系庞杂,想要从零学习或者复习都耗时耗力. 有鉴于此,本系列文章将带你更快的补足编程必备基础知识,涵盖计算机领域三大基础知识:计算机组成原理.操作系统.计算机网络,这些都是大学计算机课程里面最重要的内容.文章对这些内容做了提炼和

编程必备基础知识|计算机组成原理篇(09):CPU的控制器和运算器

计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识.关于计算机基础的课程很多,内容繁杂,但无论是相关书籍还是大学课程,都有点脱离工作.特别地,计算机基础知识体系庞杂,想要从零学习或者复习都耗时耗力. 有鉴于此,本系列文章将带你更快的补足编程必备基础知识,涵盖计算机领域三大基础知识:计算机组成原理.操作系统.计算机网络,这些都是大学计算机课程里面最重要的内容.文章对这些内容做了提炼和

.net学习必备基础知识

进入21世纪,开发Windows程序已经成为以Dll为基础,而.NET  Framwork也日益成为我们开发软件的有利工具,下边我们就来先看一下,学习.net的一些必备基础知识. 一,首先.net是由公共语言执行时期(CLR)与基底类别库(BCL)组成.这两个东西是什么呢?我们先来看一下: 1,CLR是公共语言运行时,Common language Runtime 和Java虚拟机一样也是一个运行时环境,他负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离.也就是给了我们

计算机基础知识对编程的重要性

码农和架构师的差别在哪里 从题目看文章,大家的第一想法是本篇文章是一篇讲述计算机基础知识和编程之间的关系,但是为什么开篇是这样的呢?当然这样的开篇并没有多大的意义,唯一的目的就是吸引读者而已. 纵观计算机专业的学生在毕业之后大多数会走向编写程序的道路,当然也会有部分同学有自己更感兴趣的事情,从而在毕业之后选择其他的职业.在这里根据我个人在毕业之后的编写程序的道路,写下一点总结,希望能和大家交流,有什么不对的地方,希望大家能给我指正,因为我个人觉得"三人行必有我师"是一句很有道理的话,每

快速掌握Docker必备基础知识

快速掌握Docker必备基础知识 Docker是时下热门的容器技术,相信作为一名开发人员,你一定听说过或者使用过,很多人会把Docker理解为一个轻量级虚拟机,但其实Docker与虚拟机(VM)是两种不同的计算机虚拟化技术,也有很多人会觉得,有了虚拟机,那为什么还要使用Docker呢? 带着心里的一点点疑问,让我们一起来学习Docker吧. 没有虚拟化技术的原始年代 我们仔细想想,在没有计算虚拟化技术的“远古”年代,如果我们要部署一个应用程序(Application),一般的步骤是怎么样的? 第

Oracle的DML语言必备基础知识

原文:Oracle的DML语言必备基础知识 前提是咱们都已经对常用的数据操纵语言非常熟悉了,对标准SQL: SELECT子句                --指定查询结果集的列 DROM子句                 --指定查询来自哪个表或者试图 [WHERE 子句]              --指定查询的条件 [GROUP BY 子句]           --指定查询结果集的分组的条件 [HAVING 子句]             --指定分组或者集合的查询条件 [ORDERB

SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用.下面的知识多是自己总结,有一些参考了MSDN. sp_help 有时候想尽快查出数据库对象的相关信息,这个存储过程就很有用了.使用它可以查询出整个数据库中所有对象的相关信息.直接运行sp_help结果如下图1,