c++记录实验出现的错误(5.6~6.14)

目录

5_6

一、语法错:调用函数时head部分未正确引入(未加'()')

二、逻辑错:在类的使用中,实参传给形参,形参再传给私有数据成员 

5_13 

 一、语法错:string类定义与使用错误

string是一个特殊的对象,属于引用类型

☆string类的引用要用“”,否则会被系统认定为变量

正确定义并初始化string类型变量:

5_18 

 一、逻辑错:cin>>数组输入错误

①若是采用for循环输入——每次只输入一个字符和一个回车,这个回车只被当作是你输入结束,而不会被存到数组里。

②若是采用cin直接输入——把a视为字符数组,结尾会自动补一个'\0'。

二、语法错:类的定义顺序错误

 要使该类外其他类的函数能访问本类内数据成员,则需要在类的定义之前对函数所在类进行定义。

6_2 

 一、语法错:初始化列表只能在构造函数中使用

初始化列表

6_10 

 一、语法错:静态数据成员类内定义类外初始化

​编辑 (小错误:类外定义成员函数或数据成员时不能指定存储类)​编辑

【另】①static初始一次,全局可用;②局部作用域中静态变量的特点(static):当一个函数返回后,下一次调用时,该变量还会保持返回的值,即使发生了递归调用,也不会为该变量建立新的副本,该变量会在各次调用期间共享。

6_14

 一、语法错:默认实参不在形参列表的结尾

 其_他

①main函数莫要写成mian

②class类{}后要加;


 C++程序开发过程

  • 编译 cpp->obj    某个源文件中出现语法错误(传参错误)
  • 连接 obj->exe   不同源文件之间有冲突(函数名相同导致的重复定义) 

5_6

一、语法错:调用函数时head部分未正确引入(未加'()')

【题目】定义一个Circle类,计算圆的面积。(此题取整)

#include<iostream>
using namespace std;

class Circle
{
public:
	Circle(int r)
	{
		r=radius;  //错误2:赋值方向错误
	}
	int get_area();
private:
	int radius;
};

inline double Circle::get_area()
{
	return 2*3*radius;
}

int main()
{
	int radius;
	cout<<"please enter the radius: ";
	cin>>radius;
	Circle mycircle(radius);
	cout<<"caculate the area: "<<mycircle.get_area<<endl;  //错误1:函数调用时形式不对
	return 0;
}

错误①:运行后会出现错误警告——原因是get_area后没有括号,函数调用语法错

C:\Users\Administrator\Desktop\5_6.cpp(28) : warning C4761: integral size mismatch in argument; conversion supplied

 mycircle.get_area() 要有括号,否则得到的结果都为1 

二、逻辑错:在类的使用中,实参传给形参,形参再传给私有数据成员 

如上题及程序 

错误②:代入简单数据后运行后发现

 

???

在定义circle类时构造函数的形参传给私有数据成员,赋值方向相反会造成什么情况?

 

 main函数中的radius并没有传给Circle类中的私有数据成员,至于为什么结果如此,有待考究。

5_13 

 一、语法错:string类定义与使用错误

string是一个特殊的对象,属于引用类型

string类初始化(字符串类型初始化)String类型的变量结尾都有’\0’

 string类构造函数

string(const char*s

☆string类的引用要用“”,否则会被系统认定为变量

如下例题:

更正后: 

正确定义并初始化string类型变量:

#include<iostream>
#include<string>
using namespace std;

void main()
{
	string color="";
	color="white";
	cout<<color<<endl;
}

5_18 

 一、逻辑错:cin>>数组输入错误

【题目】输入一个数,利用数组找出个位数字

【思路】利用数组找出输入数的个位数并输出

【错误】数组a是int型,for循环条件无法成立(a[i]!='\0'),因此无法输入我们想要的数。

 

既然如此,采用字符数组来判断。

 按照预期,是输入一串数字,敲回车后即可显示出所要的结果,但运行后发现不是这样,经过调试后发现回车后并没有给输入数字的后面补上'\0',如上图,输入两个数后发现a[2]!='\0'。

①若是采用for循环输入——每次只输入一个字符和一个回车,这个回车只被当作是你输入结束,而不会被存到数组里。

②若是采用cin直接输入——把a视为字符数组,结尾会自动补一个'\0'。

 调试如上,'\0'——空字符,程序运行及代码如下:

#include<iostream>
using namespace std;
int main()
{
	char a[10];
	int i;
	cin>>a[0];//仅输入a[0]
	cout<<"a[0]="<<a[0]<<endl;
	cin>>a;//数组名代表首元素地址,从a代表的地址开始读取直到结束
	cout<<endl;
	for(i=0;a[i]!='\0';i++)
	{
		cout<<"for循环"<<endl;//判断for循环次数
	}
	cout<<endl<<"for循环次数:"<<i<<endl;
	cout<<"个位数字为:"<<a[i-1]<<endl;
	return 0;
}

二、语法错:类的定义顺序错误

 要使该类外其他类的函数能访问本类内数据成员,则需要在类的定义之前对函数所在类进行定义。

 【题目】定义类X、Y、Z,函数h(X *),满足:类X有私有成员i,Y的成员函数g(X *)是X的友元函数,实现对X的成员i加1;类Z是类X的友元类,其成员函数f(X *)实现对X的成员i加5;函数h(X *)是X的友元函数,实现对X的成员i加10。在一个文件中定义和实现类,在另一个文件中实现main()函数。(考察:多文件结构与类的使用

//5_18(1).cpp  把类的声明和定义放在同一个文件里
#include <iostream>
using namespace std;

class X;
class Y;

class Y 
{         //Y的定义要放在前面,否则会造成无法引用Y中的成员函数g(X)
public:
	void g(X&);
};

class X 
{
public:
	X(){i = 0;};     //X的构造函数
	friend void Y::g(X&);//友元函数记得标明作用域
	friend class Z;
	friend void h(X&);
	void showi();
private:
	int i;
};

void X::showi()
{
	cout << "i :" << i << endl;
}

//实现Y中成员函数g(X*)
void Y::g(X& x)
{
	x.i++;
}

class Z 
{
public:
	void f(X&);
};

void Z::f(X& x)   //实现Z中的f()
{
	x.i += 5;
}

void h(X& x)    //实现h()
{
	x.i += 10;
}
//5_18(2).cpp  main函数所在源文件
#include<iostream>
#include"5_18(1).cpp"
using namespace std;

int main()
{
	X x1;   //令x1中i为0
	Y y1;
	Z z1;

	x1.showi();
	y1.g(x1);

	x1.showi();
	z1.f(x1);
	x1.showi();

	h(x1);
	x1.showi();

	return 0;
}

 正确程序如上(√) 

组建错误点提示如下:(只需把对class Y的定义放在前面即可)

--------------------Configuration: 5_18 - Win32 Debug--------------------
Compiling...
5_18(1).cpp
D:\c&c++相关资料\visual c++文件\5_18(1).cpp(12) : error C2027: use of undefined type 'Y'
        D:\c&c++相关资料\visual c++文件\5_18.cpp(5) : see declaration of 'Y'
D:\c&c++相关资料\visual c++文件\5_18(1).cpp(31) : error C2248: 'i' : cannot access private member declared in class 'X'
        D:\c&c++相关资料\visual c++文件\5_18(1).cpp(17) : see declaration of 'i'
执行 cl.exe 时出错.

5_18(1).exe - 1 error(s), 0 warning(s)

6_2 

 一、语法错:初始化列表只能在构造函数中使用

初始化列表

作用:

C++提供了初始化列表语法,用来初始化属性

语法:构造函数():属性1(值1),属性2(值2)... {}

//正确书写形式
class X
{
public:
  X(int a,int b):a(a),b(b){};//X括号里的a,b是形参
private:
  int a,b;//初始化列表中括号外的a,b和private属性的数据成员是一致的
}

如图错误——初始化列表仅能在构造函数中使用,其他函数不可用。 

6_10 

 一、语法错:静态数据成员类内定义类外初始化

 (小错误:类外定义成员函数或数据成员时不能指定存储类)

 

类的静态成员知识点验证详情见(6_12处)c++课本例题及知识点验证(6_12处)https://blog.youkuaiyun.com/AWMsilverL/article/details/125153290?spm=1001.2014.3001.5501

具体代码如下:

#include<iostream>
#include<string>
using namespace std;
//通过录入的信息记录cat的数量
class CAT
{
public:
	CAT(int weight, string color) :weight(weight), color(color) { count++; }
	static void showcount()
	{
		cout << "there are " << count << " cats here." << endl;
	}
	~CAT() { count--; }
private:
	int weight;
	string color;
	static int count; //错误——static静态数据类型的变量 类内定义类外初始化;
};

int CAT::count = 0;

int main()
{
	CAT mycat[] = { CAT(15,"white"),CAT(12,"black"),CAT(14,"orange")}; //注意string类型的变量在定义时要加“”
	CAT::showcount();
	return 0;
}

【另】①static初始一次,全局可用;②局部作用域中静态变量的特点(static):当一个函数返回后,下一次调用时,该变量还会保持返回的值,即使发生了递归调用,也不会为该变量建立新的副本,该变量会在各次调用期间共享。

6_14

 一、语法错:默认实参不在形参列表的结尾

带默认形参值的函数讲解https://blog.youkuaiyun.com/AWMsilverL/article/details/125284514?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22125284514%22%2C%22source%22%3A%22AWMsilverL%22%7D&ctrtid=XlOIk

 其_他

①main函数莫要写成mian

②class类{}后要加;


更新于2022_5_6

更新于2022_5_13

更新于2022_5_18

更新于2022_6_2

更新于2022_6_10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值