文档库 最新最全的文档下载
当前位置:文档库 › c++初级学习指南以及部分代码

c++初级学习指南以及部分代码

C++基础学习以及代码

本文主要是针对c++的初级学习的读者,主要介绍的是主要类型、非成员函数、结构体、类和对象以及响应的例子以及代码。

体会i++与++i的区别

int myage=39;

int yourage=39;

cout<<"i am:"<

cout<<"i am:"<

myage++;

++yourage;

cout<<"one year passes..."<

cout<<"i am:"<

cout<<"i am:"<

cout<<"another year passes."<

cout<<"i am:"<

cout<<"i am:"<<++yourage<<"years old."<

cout<<"let us print it again."<

cout<<"i am:"<

cout<<"i am:"<

cout<<"32"<

输出32-127的ascll字母

/*int i=32;

int j=127;

for(;i<=j;i++)

{

cout<

} */

Goto与switche的联合应用

/*loop:

char i;

cout<<"现在正在下雨吗?"<

cin>>i;

switch(i)

{

case 'Y' :

cout<<"现在正在下雨。"<

break;

case 'N':

cout<<"现在没有下雨。"<

break;

default :

cout<<"输入错误!"<

goto loop;

break; */

看输入的分数来判断等级

int i;

cout<<"你考试考了多少分?(0`100)"<>i;

if(i<60)

cout<<"您的分数等级为:"<<"差"<

cout<<"您的分数等级为:"<<"中"<

cout<<"您的分数等级为:"<<"良"<

cout<<"您的分数等级为:"<<"优"<

double power(double x,int n)

{

double val=1.0;

while(n--)

val*=x;

return val;

}

int val=0;

cout<<"enter an 8bit binary number:";

for(int i=7;i>=0;i--)

{

char ch;

cin>>ch;

if(ch=='1')

val+=power(2,i);

}

cout<<"decimal value is "<

//arctan函数

double arctan(double x)

{

double sqr=x*x;

double e=x;

double r=0;

int i=1;

while (e/i>1e-15)

{

double f=e/i;

r=(i%4==1)? r+f:r-f;

e=e*sqr;

i+=2;

}

return r;

}

//判断n是否为回文数

bool symm(unsigned n)

{

unsigned i=n;

unsigned m=0;

while (i>0)

{

m=m*10+i%10;

i/=10;

}

return m==n;

//应用指针的方法判断数组中的最大值和最小值

void max_min(int *p,int len,int *pmax,int *pmin)

{

int _max=p[0];

int _min=p[0];

for(int i=0;i

{

if (p[i]>_max)

_max=p[i];

if (p[i]<_min)

_min=p[i];

}

*pmax=_max;

*pmin=_min;

}

//指针表示数组的最大值和最小值

void _max(int *p, int n,int *pmax)

{

int _max=p[0];

for(int i=0;i

{

if(p[i]>_max)

_max=p[i];

}

*pmax=_max;

}

void _min(int *p, int n,int *pmin)

{

int _min=p[0];

for(int i=0;i

{

if(p[i]<_min)

_min=p[i];

}

*pmin=_min;

}

//结构体的利用

struct biaoge

{

int id;

char name[16];

char phone[16];

};

int main()

{

biaoge a[]=

{

{20171101,"zhangsan","189********"},

{20171102,"lisi","189********"},

{20171103,"wangwu","189********"}

};

cout<<"日期"<<"\t"<<"\t"<<"名字"<<"\t"<<"\t"<<"电话"<

{

cout<

}

return 0;

}

//学校信息系统的制作

#include

//结构

struct student

{

int id;

char name[16];

int score[3];

};

student data[100];

int count=0;

// 输入

void input(student*s)

{

cout<<"请输入编号:"<

cin>>s->id;

cout<<"请输入姓名:"<

cin>>s->name;

cout<<"请输入成绩:"<

cin>>s->score[0]>>s->score[1]>>s->score[2];

// return 0;

}

//保存

void add(const student*s)

{

data[count]=*s;

count++;

// return 0;

}

//打印出来

void listall()

{

cout<<"---------------------------------"<

cout<<"编号"<<"\t"<<"姓名"<<"\t"<<"语文"<<"数学"<<"英语"<

for(int i=0;i

{

student*s=&data[i];

cout<id<<"\t"<name<<"\t"<score[0]<<"\t"<score[1]<<"\t"<score[2]<

}

cout<<"---------------------------------"<

}

void showmenu()

{

cout<<"主菜单"<

cout<<"1、输入文件2、计数"<

cout<<"3、显示文件4、退出"<

}

//

void select()

{

int select;

student s;

cout<<"请输入菜单对应的数字:"<

cin>>select;

switch (select)

{

case 1: input(&s);

add(&s);

break;

case 2:cout<<"共输入了"<

break;

case 3:listall();

break;

case 4: break;

default:cout<<"输入错误!请重新输入!"<

}

}

int main()

{

student s;

while(1)

{

showmenu();

select();

}

return 0;

}

//链表的应用

#include

//结构

struct student

{

int id;

char name[16];

student*next;

};

//定义全局变量

student ss[3]=

{

{20171101,"liu"},

{20171102,"hua"},

{20171103,"zheng"}

};

// 寻找id

student *find(student*head,int id) {

student*p=head;

while(p)

{

if(p->id==id)

return p;

p=p->next;

}

return NULL;

}

int main()

{ //链表的构造

ss[0].next=&ss[1];

ss[1].next=&ss[2];

ss[2].next=0;

//链表的遍历

student *resech=find(&ss[0],20171101);

cout<id<<"\t"<name<

return 0;

}

//内联函数的定义

#include

using namespace std;

//内联函数,交换两个数的值

inline void swap(int *a, int *b){

int temp;

temp = *a;

*a = *b;

*b = temp;

}

int main(){

int m, n;

cin>>m>>n;

cout<

swap(&m, &n);

cout<

return 0;

}

//类与对象的使用

#include

using namespace std;

//类通常定义在函数外面

class Student{

public:

//类包含的变量

char *name;

int age;

float score;

//类包含的函数

void say(){

cout<

};

int main(){

//创建对象

Student stu;

https://www.wendangku.net/doc/9f4838252.html, = "小明";

stu.age = 15;

stu.score = 92.5f;

stu.say();

return 0;

}

#include

using namespace std;

class Student{

public:

char *name;

int age;

float score;

void say(){

cout<

}

};

int main(){

Student *pStu = new Student;

pStu -> name = "小明";

pStu -> age = 15;

pStu -> score = 92.5f;

pStu -> say();

delete pStu; //删除对象

return 0;

}

这段代码在类体中定义了成员函数。你也可以只在类体中声明函数,而将函数定义放在类体外面,如下图所示:

class Student{

public:

//成员变量

char *name;

int age;

float score;

//成员函数

void say(); //函数声明

};

//函数定义

void Student::say(){

cout<

}

在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的。

称作用域运算符或作用域限定符),用来连接类名和函数名,指明当前函数属于哪个类。成员函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前。

内联函数一般不是我们所期望的,它会将函数调用处用函数体替代,所以我建议在类体内部对成员函数作声明,而在类体外部进行定义,这是一种良好的编程习惯,实际开发中大家也是这样做的。

当然,如果你的函数比较短小,希望定义为内联函数,那也没有什么不妥的。

class Student{

public:

char *name;

int age;

float score;

void say(); //内联函数声明,可以增加 inline 关键字,但编译器会忽略

};

//函数定义

inline void Student::say(){

cout<

}

C++通过public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。

#include

using namespace std;

//类的声明

class Student{

private: //私有的

char *m_name;

int m_age;

float m_score;

public: //共有的

void setname(char *name);

void setage(int age);

void setscore(float score);

void show();

};

//成员函数的定义

void Student::setname(char *name){

m_name = name;

}

void Student::setage(int age){

m_age = age;

}

void Student::setscore(float score){

m_score = score;

}

void Student::show(){

cout<

}

int main(){

//在栈上创建对象

Student stu;

stu.setname("小明");

stu.setage(15);

stu.setscore(92.5f);

stu.show();

//在堆上创建对象

Student *pstu = new Student;

pstu -> setname("李华");

pstu -> setage(16);

pstu -> setscore(96);

pstu -> show();

return 0;

}

一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。

构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用参数初始化表。

#include

using namespace std;

class Student{

private:

char *m_name;

int m_age;

float m_score;

public:

Student(char *name, int age, float score);

void show();

};

//采用参数初始化表

Student::Student(char *name, int age, float score): m_name(name),

m_age(age), m_score(score){

//TODO:

}

void Student::show(){

cout<

}

int main(){

Student stu("小明", 15, 92.5f);

stu.show();

Student *pstu = new Student("李华", 16, 96);

pstu -> show();

return 0;

}

//构造函数

构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用参数初始化表。

#include

using namespace std;

class Student{

private:

char *m_name;

int m_age;

float m_score;

public:

Student(char *name, int age, float score);

void show();

};

//采用参数初始化表

Student::Student(char *name, int age, float score): m_name(name),

m_age(age), m_score(score){

//TODO:

}

void Student::show(){

cout<

}

int main(){

Student stu("小明", 15, 92.5f);

stu.show();

Student *pstu = new Student("李华", 16, 96);

pstu -> show();

}

运行结果:

小明的年龄是15,成绩是92.5

李华的年龄是16,成绩是96

如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然

使用参数初始化表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简明明了。

注意,参数初始化顺序与初始化表列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。请看代码:

#include

using namespace std;

class Demo{

private:

int m_a;

int m_b;

public:

Demo(int b);

void show();

};

Demo::Demo(int b): m_b(b), m_a(m_b){ }

void Demo::show(){ cout<

int main(){

Demo obj(100);

obj.show();

}

运行结果:

2130567168, 100

在参数初始化表中,我们将m_b 放在了m_a 的前面,看起来是先给m_b 赋值,再给m_a 赋值,其实不然!成员变量的赋值顺序由它们在类中的声明顺序决定,在Demo 类中,我们先声明的m_a,再声明的m_b,

初始化const 成员变量

参数初始化表还有一个很重要的作用,那就是初始化const 成员变量。初始化const 成员变量的唯一方法就是使用参数初始化表。例如VS/VC 不支持变长数组(数组长度不能是变量),我们自己定义了一个VLA 类,用于模拟变长数组,请看下面的代码:

class VLA{

private:

const int m_len;

int *m_arr;

public:

VLA(int len);

};

//必须使用参数初始化表来初始化 m_len

VLA::VLA(int len): m_len(len){

m_arr = new int[len];

}

//析构函数

创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存、关闭打开的文件等,这个函数就是析构函数。

析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构

注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。

上节我们定义了一个VLA 类来模拟变长数组,它使用一个构造函数为数组分配内存,这些内存在数组被销毁后不会自动释放,所以非常有必要再添加一个析构函数,专门用来释放已经分配的内存。请看下面的完整示例:

#include

using namespace std;

class VLA{

public:

VLA(int len); //构造函数

~VLA(); //析构函数

public:

void input(); //从控制台输入数组元素

void show(); //显示数组元素

private:

int *at(int i); //获取第i个元素的指针

private:

const int m_len; //数组长度

int *m_arr; //数组指针

int *m_p; //指向数组第i个元素的指针

};

VLA::VLA(int len): m_len(len){

if(len > 0){ m_arr = new int[len]; /*分配内存*/ }

else{ m_arr = NULL; }

}

VLA::~VLA(){

delete[] m_arr; //释放内存

}

void VLA::input(){

for(int i=0; m_p=at(i); i++){ cin>>*at(i); }

}

void VLA::show(){

for(int i=0; m_p=at(i); i++){

if(i == m_len - 1){ cout<<*at(i)<

else{ cout<<*at(i)<<", "; }

}

}

int * VLA::at(int i){

if(!m_arr || i<0 || i>=m_len){ return NULL; }

else{ return m_arr + i; }

}

int main(){

//创建一个有n个元素的数组(对象)

int n;

cout<<"Input array length: ";

cin>>n;

VLA *parr = new VLA(n);

//输入数组元素

cout<<"Input "<

parr -> input();

//输出数组元素

cout<<"Elements: ";

parr -> show();

//删除数组(对象)

delete parr;

return 0;

}

this 是C++ 中的一个关键字,也是一个const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。

下面是使用this 的一个完整示例:

#include

using namespace std;

class Student{

public:

void setname(char *name);

void setage(int age);

void setscore(float score);

void show();

private:

char *name;

int age;

float score;

};

void Student::setname(char *name){

this->name = name;

}

void Student::setage(int age){

this->age = age;

}

void Student::setscore(float score){

this->score = score;

}

void Student::show(){

cout<name<<"的年龄是"<age<<",成绩是"<score<

}

int main(){

Student *pstu = new Student;

pstu -> setname("李华");

pstu -> setage(16);

pstu -> setscore(96.5);

pstu -> show();

return 0;

}

相关文档