目录
一、语法错:调用函数时head部分未正确引入(未加'()')
二、逻辑错:在类的使用中,实参传给形参,形参再传给私有数据成员
①若是采用for循环输入——每次只输入一个字符和一个回车,这个回车只被当作是你输入结束,而不会被存到数组里。
②若是采用cin直接输入——把a视为字符数组,结尾会自动补一个'\0'。
要使该类外其他类的函数能访问本类内数据成员,则需要在类的定义之前对函数所在类进行定义。
编辑 (小错误:类外定义成员函数或数据成员时不能指定存储类)编辑
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
一、语法错:静态数据成员类内定义类外初始化
(小错误:类外定义成员函数或数据成员时不能指定存储类)![](https://i-blog.csdnimg.cn/blog_migrate/1902396b0e0c9734f226464cf3b1d572.png)
类的静态成员知识点验证详情见(6_12处)c++课本例题及知识点验证(6_12处)https://blog.csdn.net/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
一、语法错:默认实参不在形参列表的结尾
其_他
①main函数莫要写成mian
②class类{}后要加;
更新于2022_5_6
更新于2022_5_13
更新于2022_5_18
更新于2022_6_2
更新于2022_6_10