整理了大一学C++的一些笔记(一)
以下是本篇文章正文内容
一、C++是什么?
这里引用某百科的一段:
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
**- 如果初学的话可以认为C++和C语言差不多, 我们知道C语言是一种面向过程编程的语言,但是C++是一种面向对象的编程语言,大家可能就要有疑惑了,什么是”面向对象的编程语言”呢,这里再引用某百科的一段
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
简单来说,大家可以理解为面向对象是面向过程的一种不同的执行方法 ,比如:我们在吃饭的时候,要有一个过程吧,做饭,盛饭,吃饭,三个步骤,你可以在main里面写,先做饭,再盛饭,然后吃饭。这是面向过程的理解。
如果用面向对象的角度,我们就可以写三个函数,做饭函数,盛饭函数,吃饭函数。我可以做了饭不盛,也可以盛了饭不吃,只关乎于我怎么调用这些函数,而你main里面写的做饭盛饭吃饭是不是少一个,程序就进行不下去了呀。这就是面向对象和面向过程的区别,很好理解吧。
二、C++的特点
1.不同于C文件的.C后缀名,C++文件的后缀名是 cpp (就是c plus plus的缩写)
2.基础头文件:#include< iostream >,如果用到C语言头文件不要写.h,在前面加个c,
比如#include< stdio.h>换成#include< cstdio> , < cstdlib>等等,当然.h也可以,只是c更帅一点
3.namespace,命名空间,这是一个新名词,首先要大家记住这件事,在你写的每个程序开头,都要这么写
#include<iostream>
using namespace std;
至于为什么,咱们以后再说
4.变量的定义:C++可以随用随定义,不需要提前定义好。例如:可以在for循环开始前定义 i
for(int i = 0;i<n;i++){
....
}
5. 与C语言不同的:
1> c语言没有对全局变量重定义的检测,c++会报错全局变量重定义。
2>c语言定义一个结构体(不加typedef),再定义一个结构体变量时需要写struct,否则会报错,而c++不需要写struct。
3> c语言定义函数如果不声明类型,默认类型为int,c++会检测出错,让你去声明类型。
#include <stdio.h> //c语言不会检测出error
get_num() {
}
int main(int argc, char *argv[]) {
return 0;
}
---------------------------
#include <iostream> //c++会有error
get_num{
}
int main(int argc, char** argv) {
return 0
} //[Error] 'get_num' does not name a type
4> 布尔类型(bool)
只有true和false两个值,true数值为1,false数值为0.
只要赋值不为0,true的值都为1
bool类型大小只有1个字节
可以将任何值赋值给bool类型的变量
以下4个值为false :
0 , ‘\0’ ,NULL , false
bool b = 1;
b = true;
b = "OK"
其他一切值如果赋值给bool类型的变量都视为true
5> 三目运算符可以当左值。
#include <iostream>
using namespace std;
int main(void){
int a=5,b=7;
(a>b)?a:b = 10;
cout<<((a>b)?a:b)<<endl;
}//运行结果:10
6> c++中枚举变量只能赋值给枚举,不能直接赋值
enum season{ SPR = 0,SUM,AUT,WIN
}
enum season s = 2;//错误
enum season s = AUT;//正确
7>如果对一个常量取地址,编译器会临时开辟一个空间,让指针存放这个临时空间的地址 .这个常量不会变,但是这个指针可以改变值。
6.引用的用法
1>数据类型 &名字=变量
作用:名字成为变量的别名
*PS:1>引用没有定义,是一种关系型声明。声明它和原有某一变量的关系。故而类 型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。 *
2>声明的时候必须初始化,一经声明,不可变更。
3>可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
4>& 符合前有数据类型时,为引用,其他均为取地址
2>函数参数的引用
例:
void swap(int &a,int &b)//整形引用
{
int temp;
temp=a;
a=b;
b=temp;
}
void STU(struct student &s)//结构体变量引用
{
cout << s.id << " " << s.name << endl;
}
3>引用作为函数参数的返回值:
int &getnum(){
static int num=10;
return num;
}
int main(void) {
getnum()=100;
cout << "num=" << getnum() << endl;
}
函数可以当左值,前提是返回的是静态变量或全局变量
4>指针引用
#include <iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
struct teacher{ //结构体 老师
int id;
char name[64];
};
int get_mem(struct teacher* &tp) //形参的引用,不需要使用指针,简化了函数
{
tp=(struct teacher *)malloc(sizeof(struct teacher));//分配空间
if(tp==NULL){
return -1;
}
tp->id=100;
strcpy(tp->name,"li4");
return 0;
}
void free_teacher(struct teacher *&tp) //free函数
{
if(tp=NULL){
return;
}
if(tp!=NULL){
free(tp);
tp=NULL;
}
}
int main(void) {
struct teacher *tp=NULL;
get_mem(tp);
cout << tp->id<<endl<<"name "<<tp->name <<endl;
free_teacher(tp);
return 0;
}
5>const引用
常量引用的格式:const int &a。
int main(void){
const int c = 10;
const int &r1 = c; // 正确,引用及其对应的对象都是常量
r1 = 20; // 错误,r1是对常量的引用,不可改变
int &r2 = c; // 错误,不能让一个非常量引用指向一个常量对象
}
对一个const常量进行引用,必须是一个const引用
int i = 20;
const int &r1 = i; // 允许将const int&绑定到一个普通int对象上
const int &r2 = 30; // 正确,r2是一个常量引用
const int &r3 = r1 * 2; // 正确,r3是一个常量引用
int &r4 = r1 * 2; // 错误,r4是一个普通的非常量引用
对一个普通变量,可以使用const引用