C++自学笔记

  • 格式:docx
  • 大小:33.63 KB
  • 文档页数:11

第一章C++新特征1.1 C++程序结构下面我们从一个最简单的程序入手看一个C++程序的组成结构。

//这个头文件包括了C++中定义的基本标准输入输出程序库的声明。

#include <iostream.h>//C++标准函数库的所有元素都被声明在std命名空间。

因此为了能够访问它的功能,我们用//这条语句来表达我们将使用标准名空间中定义的元素。

using namespace std;int main() { //main函数是程序的入口//cout 是C++中的标准输出流cout << “请输入一个整数!”<<endl;int x=0;//cin是C++中的标准输入流cin>>x; //getline(x);cout << oct<<x<<endl;//8进制输出cout << dec<<x<<endl;//10进制输出,dec可不写,默认10进制cout << hex<<x<<endl;//16进制输出cout << “请输入一个布尔值(0,1)!”<<endl;bool y =false;//C++中新加入的数据类型bool类型(true,false)cin>>y;cout<<boolalpha<<y<<endl//输出布尔值(1是true,0是false)system(“pause”);return 0;}1.2定义命名空间,关键字:namespacenamespace A{int x=0;void f1();void f1(); } namespace B{int x=2;void f1();void f1(); }Cout<<A::x<<endl;//引用A命名空间的变量x B::f1();//引用B命名空间的方法1.3 const与基本数据类型int x = 3;//变量const int *p =&x; //*p不可变,p可变const int *const p=&x; //p和*p的都不可变const int x=3;int *y = &x; //编译不通过const int x = 3;//常量,值不可改变int *const p=&x; //p不可变,*p可变const int &y = x;//x可变,y不可变int x=3; const int *y = &x; //编译可通过1.4引用1.4.1基本数据类型的引用#include<isotream>Using namespace stdint main(void){int a=3;int &b = a; //引用必须初始化b = 10; //此时a的值是10cout<<a<<endlreturn 0;}1.4.2结构体类型的引用typedef struct{int x;int y;}Coor;#include<isotream> using namespace std int main(void){Coor c1;Coor &c = c1;c.x=10;c.y=20;cout<<c1.x<<c1.yreturn 0;}1.4.3指针类型的引用int a = 10;int *p = &a;int *&q = p;//指针类型的引用*q = 20;1.4.4引用作函数参数//C中实现2个整数的交换void fun(int *a,int *b){Int c=0;c = *a;*a = *b;*b=c;}//C++中实现2个整数的交换void fun(int &a,int &b){Int c=0;c = a;a = b;b=c;}1.5 函数1.5.1 函数参数默认值有默认参数的参数必须在参数表的最右端;例如:void fun(int i , int j=5 , int k=10);void fun(int i; int j=5; int k);//这种方式是错误的无实参则用默认值,否则实参覆盖默认值;void funn(int i , int j = 5, int k = 10){ cout<<i<<j<<k<<endl;} int main(){fun(20);//输出结果为20 5 10fun(20,30);//输出结果为20 30 10 return 0;}1.5.2 函数的重载在相同作用域内,函数名相同,参数个数和参数类型不同,称为函数的重载Void fun(int i);Void fun(int i,int j);1.5.3内联函数关键字:inlineinline int max(int a , int b , int c );int main(){int i = 10 , j=20 , k = 30,m;m=max(i,j,k);cout<<”max = ”<<m<<endl;return 0;}内联函数是编译时将函数体代码和实参代替函数调用语句;内联编译是建议性的,由编译器决定;逻辑简单,调用频繁的函数建议使用内联;递归函数无法使用内联方式。

1.6 内存的申请和释放申请内存:int *p = new int;释放内存:delete p ;int *arr = new int[10]; //申请块内存delete []arr;//释放块内存内存申请注意事项:Int *p = new int[1000];if( NULL==p){//内存分配失败}第二章类和对象2.1 类的定义使用class关键字定义类:class TV{ //定义类,TV是类名public://修饰符公共的, private私有的,protected保护的char name[20];//成员变量int type; //成员变量void run(); //成员函数}2.2实例化对象和成员访问栈实例化对象堆实例化对象int main(void){TV tv;TV tv[20]; } int main(void){TV *tv = new TV();TV *tv2 = new tv2[20];delete tv; //堆实例化一定要回收delete []tv2;}栈实例化对象访问: Tv.type = 0;堆实例化对象访问Tv->type = 0;2.4 string类型2.4.1初始化string对象的方式string s1; s1为空字符串string s2(“abc”); 用字符串值初始化s2string s3(s2); 将s3初始化为s2的一个副本string s4(3,c); 将s4初始化为”ccc”2.4.2 string的常用操作s.empty() 判断字符串s是否为空,为空返回true,否则返回false s.size() 返回字符串的个数s[n] 返回字符串s中n位置的字符,位置从0开始s1+s2 连接2个在字符串,返回新的字符串s1 = s2 s2的内容赋值给s1;s1 ==s2 判断相等,相等返回true,否则返回falses1!=s2 判断不等,不等返回true,否则返回false第三章面向对象编程面向对象的三大特性:封装、继承和多态3.1 封装3.1.1 数据的封装将类中的属性定义为私有属性,不允许外部直接访问,而是通过该类提供的get()和set()方法来访问和操作这些属性。

类内定义的函数默认为内联函数例如:class Student{private:string name;int age;public:string getName(){return name}void setName(string _name){ name = _name;}int getAge(){return name}void setAge(string _ age){ age = _ age;}};3.1.2 类外定义类外义表示函数在类内部声明,函数体在类外部定义;类外定义又分为同文件类外定义和分文件类外定义。

(1)同文件类外定义:表示函数的声明和定义在同一个文件内。

例如:新建一个文件Car.cppclass Car{public:void run();void stop();};void Car::run(){…}void Car::stop(){…}(2)分文件类外定义:在Car.h文件中定义一个类,在Car.cpp文件中定义类中的函数。

例如:新建2个文件Car.h和Car.cppCar.h文件内容Car.cpp文件内容class Car{ public:void run();void stop(); }; #include “Car.h”void Car::run(){…} void Car::stop(){…}3.1.3 构造函数构造函数在对象实例化时被调用,构造函数与类名相同,构造函数没有返回值,构造函数可以有多个重载形式,实例化对象时仅用到一个构造函数,当用户没有定义构造函数时,编译器自动生成一个构造函数。

1.数据的初始化列表:初始化列表在构造函数前执行,只能用于构造函数,可同时初始化多个数据成员。

推荐使用初始化列表初始化数据。

常量只能用初始化列表初始化例子:class student{public :student():name(”jim”),age(10){…}private :string name;ing age;};2.拷贝构造函数:把一个对象赋值给相同类的另一个对象时会调用拷贝构造函数例:student s1;student s2=s1;//此时会调用拷贝构造函数拷贝构造函数的定义格式:类名(const 类名&变量名){ }例如:student(const student& stu){ … }//变量stu就是s1;没有定义拷贝构造函数时,系统会自动创建。

3.1.4浅拷贝和深拷贝(1)、浅拷贝:在拷贝构造函数中通过赋值的对象,把对象的属性和地址赋值给另一个对象。

class Array{public:student(int _count){count = _count;pArr = new int[count];}student(const student & arr){count = arr. count;pArr = arr. pArr;}~student(){delete []age;age =NULL;}private:i nt count;ing *pArr;};此时s2.age 和s1.age指向同一块地址,如果s1销毁之后,s2再销毁就会出错。