#include<iostream>
using namespace std;
int main()
{
return 0;
}
这是基本上所有的C++文件都有的格式。
目录
char a[]=" ";//strcpy(a, "hello");
void *memset(void *s, int ch, size_t n);
char *strncpy(char *dest, const char *src, size_t n)
6.[Error] empty character constant
7.[Error] prototype does not match for
8.[Error] 'strcpy' was not declared in this scope
10.[Warning] multi-character character constant [-Wmultichar]
11.[Error] ld returned 1 exit status
13.[Error] expected ';' at end of member declaration
14.[Error] extra qualification 'Date::' on member 'Date' [-fpermissive]
15.[Error] new types may not be defined in a return type
17.有return 0/return 1的函数类型,不是void而是int
[Error] request for member 'class里的函数' in 'class的名字', which is of non-class type 'class的原名'
19.memset(a, 0, strlen(a));可以但是memset(a, 0, sizeof(a));(未解决
快捷键以及其他注意点
F9 编译;F10 运行;
每改一次代码都得先按编译,再按运行,直接按运行还是执行的更改前的文件。或者直接按编译运行(F11)
注释,//某某某,/*某某某*/,第二个可以换行,第一个不行
外部声明和局部声明不一样,分别在main的内外两侧
函数名里的下划线是按着shift再按0后面的那个按键得到的,(一般的话,函数名里没有中划线
class里的函数直接在class里面定义的话。大括号后面不用加分号。
定义class的/class date/后面啥都不用加,就加一个大括号就ok
结尾必须有分号,c++语句里都必须有分号,编译预处理不用分号。
代码解析
iostream
#include<iostream>
包含c++的标准输入输出头文件iostream
iostream.h是input output stream的简写,意思为标准的输入输出流头文件。它包含:
(1)cin>>"要输入的内容"
(2)cout<<"要输出的内容"
这两个输入输出的方法需要#include<iostream>来声明头文件。
#include<iostream.h>是在旧的标准C++中使用。在新标准中,用#include<iostream>
#include<iostream>是标准的C++头文件
using namespae std;
using namespace std;
具体原因:
![](https://img-blog.csdnimg.cn/71cc3873bff84c58a52ee3af2adcb217.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbTBfNTE0NjQzNTI=,size_20,color_FFFFFF,t_70,g_se,x_16)
网址(2条消息) iostream_UncleJokerly-CSDN博客
#include<string.h>
#include<string.h>
str的一番操作
strcat是连接
strcpy的复制,后面的复制到前面去,相当于等号在中间,赋值
包括常用函数如下:
strlen求字符串长度
strcmp比较2个字符串是否一样
strcat字符串连接操作
strcpy字符串拷贝操作
strncat字符串连接操作(前n个字符)
strncpy字符串拷贝操作(前n个字符)
strchr查询字串
strstr 查询子串
include<stdlib.h>和include<cstdlib.h>
这个讲的很清楚,就是调用特定的函数时加上,但是c++的话,还是加后面的那个cstdlib就ok
setsystemdate里的time_t 和
私有函数是一个很神奇的存在,俺现在还没有弄明白为啥要有私有函数
好像私有函数是用来被其他函数调用的。比如说,共有函数可以调用私有函数。所以私有函数一般里面调用的其他函数都是系统自带的函数了。
对神奇的setsystemdate进行深挖:
inux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。
time_t 这种类型就是用来存储从1970年到现在经过了多少秒,
咋感觉time_t这个东西那么抽象呢???!!这好像不是一个函数也不是一个结构体,总而言之,这就不是一个可以直接用的东西
算了,打住吧,这个我放弃了,改天再说吧,现继续听下去
srand(time(NULL));
(4条消息) srand((unsigned)time(NULL))详解_点滴的岁月-CSDN博客_srand(time(null))
这个讲的很清楚,一个是srand()用来产生随机数,但是是伪随机数,所以要变 ()里的内容,
所以要用time:
即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的数据。
rand()
使用该函数首先应在开头包含头文件<stdlib.h>
rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,
所以rand(),前,得有,srand(time(NULL))提供种子。
struct tm直接存储年月日的结构:
struct tm
{
int tm_sec; /*秒,正常范围0-59, 但允许至61*/
int tm_min; /*分钟,0-59*/
int tm_hour; /*小时, 0-23*/
int tm_mday; /*日,即一个月中的第几天,1-31*/
int tm_mon; /*月, 从一月算起,0-11*/ 1+p->tm_mon;
int tm_year; /*年, 从1900至今已经多少年*/ 1900+ p->tm_year;
int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
int tm_isdst; /*日光节约时间的旗标*/
};
需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2011年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。
int main()
int main()
int 计算结果是整数
只有一个main,优先执行main大括号里的内容
return 0;
return 0
函数结束并且计算结果是0
cout
cout<<"hello world"<<endl;
cout<<'\r';
不换行,光标返回本行的首位。一出现没有完全覆盖的bug,如图
Solution:
cout<<'\r \r';
含义:回到首位,然后打印好多好多空格,然后再回到首位。
还可以控制输出的小数位数
#include <iomanip>//切记加入这行代码
(1条消息) C++函数学习:cout函数详解_Qihonghao_的博客-CSDN博客_cout函数
这里讲了,用到的时候回去看吧
两个小于号是一个插入运算符,几个输出项几对小于号。
输出变量:<<month<< 就ok
输出字符串用" 请输入m的值:" 要用双引号——“date1:”这是个字符串,不是变量,因为这是个class
cout<<'\n' 这个是用单引号的,就是转义字符用单引号——一个转义字符是单引号,多个转义字符的双引号
cout<<'\n'是换行
cout<<'\b'是退格,即删除
endl代表换行
#include<iostream>
using namespace std;
int main()
{
class clock
{
private: //私有成员 (数据成员一般是私有成员)
int hour;
int minute;
int second;
float price;
public: //共有成员 (函数成员一般是公有成员)
void set(int h,int m,int s,float p);
void run();
void report_time();
void show_time()
{
cout<<hour<<':'<<minute<<':'<<second;
};
};
void clock::set(int h,int m,int s,float p)
{
hour=h;
minute=m;
second=s;
price=p;
};
void clock::run()
{
int i=0;
for(i=0;i<10;i++)
{
second++;
if(second=60)
{
second=0
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
cout<<'\r';
sleep(1000);
show_time();
}
}
};
void clock::report_time()
{
show_time()
if(minute==0&&second==0)
{
for(int i=0;i<hour;i++)
{
cout<<"\007";
sleep(1000);
}
}
};
}
写了这个代码,老是报错,
全是{}的问题,但是不太清楚咋改,先放放再往后学一下,应该是类还是不明白
这个问题是定义class的所有语句都不要放在int main()里面,得放在外面
单独定义函数的时候大括号外面要加;吗? ——不用加
结构体的定义声明和引用
(上个网址讲的是真的全面)
C++结构体的定义、初始化和引用_fly_time2012的专栏-CSDN博客_c++结构体变量的定义
这个例子多 (这个还没看,今天晚上实在是看不动了
自己总结一下
struct inflatable
{
char name[20];
std::string name;//让结构访问名称空间std
float volume;
double price;
}; //分号千万别忘了,内外呼应
inflatable hat=
{
"bit is lovely", //逗号千万别忘了
2.0,
123,
};
std::是个名称空间标识符;一般来说,std都是要调用C++标准库时使用。
比如:使用标准库文件iostream时,要写上std;使用非标准库文件iostream.h,不用写。如图引入非标准库iostream.h时,省去了std::。
当然使用标准库时,也是可以省略的,不过需要进行处理。处理方法2. 将命名空间释放出来using namespace std 告诉编辑器我们将要使用名字空间std中的函数或者对象,所以cout和endl前面不用注明他们是std这个名字空间中的cout和endl。
初始化
inflatable hat={"bit is lovely",2.0,123};//等号可写可不写
inflatable hat {};//这样各个成员将被设置为0
成员赋值
(一个结构体等于另外一个结构体)
两步合一步
struct inflatable
{
char name[20];
float volume;
double price;
}hat,mouth;//这样不对,我还没弄明白咋合
面向对象的开发实体对象与类的概念(class上场)
实体:抽象,属性(静态和动态)——对象,由实体加工而来——类,对象的集合体(数据加函数)高级的结构体,语法格式与结构体相似
四种基本数据类型:字符整数浮点双精度
新的数据类型——用来吧实体转化成数据
数据的抽象与封装
类寄存多态,面向对象开发方法。重点难点
继续听课
两种程序设计思想:
面向过程的程序设计
面向对象的程序设计
为什么引入数组、函数、指针、结构体;
抽象、封装、继承:
多态性设计思考
类
class的样子
int main()
{
class clock
{
private: //私有成员 (数据成员一般是私有成员)
int hour;
int minute;
int second;
public: //共有成员 (函数成员一般是公有成员)
protected: //保护成员
}
}
公有私有保护:
类型 | 访问 | 内容 |
公有成员 | 类外能够直接访问 通过(.)运算符 | 一般函数成员 |
私有成员 | 类外不能直接访问 | 一般数据成员 外界不能随便改 |
保护成员 | 外界部分区域能够访问 |
公有成员
通过调用公有函数成员实施规定的操作
外界与类之间起着接口的作用
例如:钟表类中的设置函数set(int,int,int,float)就定义成公有成员
私有成员
使得成员被封装隐藏起来,外界不能随便修改对象的私有数据成员
只有通过类中公有函数对数据进行修改,达到数据的安全性
保护成员
私有是对外界完全封闭,公有是完全开放,保护是介于两者之间
例如:下面有两个类的定义,一个是时间类,一个是日期类
class Clock
{
public:
void set(int h,int m,int s,float p)
{ //对小时、分钟、秒钟的值进行有效性检验后,再赋值
Hour = h>=0&&h<=24? h : 0;
Minute = m>=0&&m<=60? m : 0;
Second = s>=0&&s<=60? m : 0;
Price = p;
}
} ; //分号别忘
Clock XJTU;
XJTU.set(11,23,25,1000); // 这是允许的
XJTU.Hour=10; // × 这是不允许的,钟表类的时分秒定义为私有成员,通过set()函数才能修改
————————————————
版权声明:本文为CSDN博主「uncle_ll」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/uncle_ll/article/details/121367566
类的定义语法格式:
class XXX
{
XXX
}
对于class里的函数,定义方法有两种,class里和class外,里和以前一样,外面变一变,引用的方法。
<类型> <类名>::<函数名>(<参数表>)(这个类型是函数的类型还是class啊?
{
<函数体>
};//分号别忘了 这个模板有问题,老是报错
:问题所在,class的所有的定义要在int main()的外面,class的定义
class clock
{
};
的后面要加;,但是函数的定义(
void clock::report_time()
{
}
)的后面不用加;
#include<windows.h>
这个很重要但是有的时候加上会出错,俺也不知道咋回事
对象声明与引用。
声明:类名 变量1,2,3(和srtuct的很像,是类名不是class\struct)
引用:同struct,用(.)访问,只能访问公有成员
构造函数
(自动初始化的普通函数
要求同名和class的命一模一样
系统会自动调用的函数(见constructor这个代码
指针:
vector<string> v(10);
vector 的初始化:可以有五种方式,举例说明如下:
(1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
(2)vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
(3)vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
(4)vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
(5)int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+7); //从数组中获得初值
vector.size()
vector 的size函数返回vector大小,返回值类型为size_type
,Member type size_type is an unsigned integral type,即无符号整数
;
指向int型的(正常类型的)
int a=2;
int *p=&a;//必须得加&
cout<<*p;//必须得加*
指向class里的函数的
void(Date::*p3)(int,int,int);
//此行与class里的function无关,定义的是指针和Date class的关系
p3=Date::init;
//此行确定指针和class里的function的关系(不管有无参数,别加括号以及其中的参数
(date1.*p3)(2006,8,8);//直接调用
函数重载
名一样参数不一样
构造函数也是允许重载的
数据成员初始化的四种方法
关于我实在是听不懂老师给的慕课这个事情,很困惑——原来听不懂的地方是规定啊
先把这个网址的解释理清楚再说吧:——啊我听懂了
C++ 类 构造函数 constructor - 王陸 - 博客园 (cnblogs.com)https://www.cnblogs.com/wkfvawl/p/10600269.html 1.必须得初始化,但是类的数据成员是不能在声明类时初始化的。只有静态常量整型数据成员才可以在类中初始化。其中最重要的方式就是构造函数(constructor)。记得,他没有类型,没有返回值,所以构造函数没有返回值,连void也不行。前面别加char/int/void啥的
2.如果数据成员是私有的,该如何进行初始化?可以通过类的一个公有接口来进行“初始化”,
即mooc里的构造函数的定义,而且必须有默认被调用的功能,不能等程序员执行。所以,它得和class同名。
3.构造函数还细分为两种:缺省(无调用参数)、参数化(有调用参数)
还有复制构造函数,我是没看懂这个是干啥的,好像括号里有地址符号
运算符重载
C++ 规定,=
只能重载为成员函数
const intcell & operator=
还是不太懂
(4条消息) C++ 运算符重载_高祥xiang的博客-CSDN博客_c++运算符重载
有空看看这个
string和char a[20]的初始化定义
string的初始化string a=" ";
string a="asdkjahksjd";
string的定义要注意存贮地址的同一性
关于String的两种赋值方式 - JamKong - 博客园 (cnblogs.com)
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
string str = "hello c++! +++";
string a="hello c++! +++";
str.erase(0);
cout<<a<<endl;
cout<<str<<endl;
}
这个的运行结果改str,a的内容也会改,因为是同一地址而不只是同一内容
char a[]=" ";//strcpy(a, "hello");
//都可以:
char a[10]="hello";
har a[]="hello";
char a[10]={'h','e','l','l','o'};
strcpy(a, "hello");
//这个不行:
a[10]="hello"
void *memset(void *s, int ch, size_t n);
atoi()
得有#include<cstdlib.h>
这个的作用是
atoi():int atoi(const char *str );
int sum1=atoi(s1);
功能:把字符串转换成整型数。
str:要进行转换的字符串
返回值:每个函数返回 int 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则atoi的返回值为 0。
说明:当第一个字符不能识别为数字时,函数将停止读入输入字符串。
char *strncpy(char *dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
system( “pause “);
system("pause")
C++使用system( “pause “);来暂停黑窗口
在编写的c++程序中,如果是窗口,有时会一闪就消失了,如果不想让其消失,在程序中添加:
system(“pause”);
注意:不要再return 的语句之后加,那样就执行不到了。
length()和strlen(p)和sizeof()区别
对于char a[]这一类型的字符可以用strlen也可以用sizeof但是strlen比sizeof少一个最后的/0
sizeof的功能是计算一个数据类型的大小,这个类型可以是数组、函数、指针、对象等,单位为字节,它的返回值是size_t类型,也就是unsigned int类型,是一个无符号整数。注意:sizeof不是一个函数,它是一个运算符,所以它不需要包含任何头文件。
strlen的功能是计算一个指定字符串的长度,函数原型是size_t strlen(const char *s),它的返回值是size_t类型,也就是unsigned int类型,返回的是字符串的长度,需要包含头文件#inlude <string.h>,参数s是字符串首地址。
strlen( )的参数必须是char*
str.length( )是string类对象str调用的成员函数
所以string类型的计算字符串长度还是用length()比较好
(1条消息) c/c++中sizeof()、strlen()、length()、size()详解和区别_z_qifa的博客-CSDN博客_c++ lengthhttps://blog.csdn.net/z_qifa/article/details/77744482原谅我实在是不想看了,我回来再看回来再看
char *t; strcpy(type,t);
char *t;
strcpy(type,t);
字符型指针和 字符串是啥关系啊,感觉字符型指针完全可以当成字符串用。
sleep(1000)
[Error] ‘sleep‘ was not declared in this scope——把s改成S。
cout<<"显示omiga的时间"; //这个是对的
cout<<'显示omiga的时间'; //这个是错的
得用双引号。
疯狂debug的故事
1.if里的等号
if(second==60)
if(second=60)
少写了一个等号,运行结果不对
前面是对的样子,后面是不对的样子。判断出来是run出的错,就去检查了一下,然后就看出来了
2.多个for循环嵌套里语句命令的位置
几个for套起来,放错位置了,就循环的不对更新的次数不对。往里放了一层,拿出来了这是。
3.class定义完以后大括号后面要加;
4.忘记加分号了,在语句后面
这个还好说,因为在debug后面一看就看出来了
5.time.h里面的月份数拼写是简写
是tm_mon而不是tm_month
![](https://img-blog.csdnimg.cn/3b4c87908d69467e888296e1bdfed697.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR5LiN5piv55uW6Iyo5q-U,size_10,color_FFFFFF,t_70,g_se,x_16)
6.[Error] empty character constant
cout<<''<<"o_o";
这是因为当字符常量为空格字符时,不能只输入两个单引号,还必须在两个单引号之间输入一个空格;不然编译的时候就报错,提示空字符,
两个单引号之间不加任何内容是不允许的
7.[Error] prototype does not match for
'void automobile::set_data(char*, char*, int, int, int)'any in class 'automobile'
这个错误是定义函数时函数包含的变量类型以及数量与函数初始化的时候括号里的内容不匹配
这种错误在函数量比较多的时候易出现
8.[Error] 'strcpy' was not declared in this scope
在前面加上 就ok
#include<windows.h>
9.cin>>a;而不是cin<<a;
10.[Warning] multi-character character constant [-Wmultichar]
cout<<'\b\b\b'<<" ";不对,应该是"\b\b\b"
11.[Error] ld returned 1 exit status
- 1.程序没有主函数
- 2.printf/scanf书写错误
- 3.1在主函数中出现自定义函数名书写错误(即出现在主函数前未出现的自定义函数)
- 3.2当自定义函数只进行了声明,主函数便进行调用
- 4.上一个运行结果未关闭
我的原因是用的函数没加上对应的头函数
#include <mmsystem.h>是mciSendString(str,NULL,0,NULL);对应的头函数
emm, mciSendString又他自己的特殊性,只加哥头文件不能解决问题,这个问题以后再说吧
12.void print_ymd();空格别忘
这是个class里的print函数,但是得加()
13.[Error] expected ';' at end of member declaration
在class里定义函数的时候,后面必须加上分号,否则就会报这个错
public:Date(char *ps);
14.[Error] extra qualification 'Date::' on member 'Date' [-fpermissive]
这个是class下面那个大括号后面那个没加,让devc以为你在class里面定义函数,其实你是在class外面定义函数滴
15.[Error] new types may not be defined in a return type
类声明或定义结束时没有加;
16.Date (*ps)
Date::Date(char *ps):year(1900),month(1),day(1)
{
char py[5],pm[3],pd[3];
strncpy(py,ps,4);
ps=ps+5;
strncpy(pm,ps,2);
ps=ps+3;
strncpy(pd,ps,2);
int yy=atoi(py),mm=atoi(pm),dd=atoi(pd);
这个不能执行,俺也不知道为啥
[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
这个报错可能和这个char *ps也有关系;
17.有return 0/return 1的函数类型,不是void而是int
18.没有参数的构造函数
定义的时候的格式:
OrderedCollection()
{
strcpy(a,"you haven't input any parameters!");
};
//{}()这俩缺一不可
使用的时候
OrderedCollection c1;//没参数千万别加上小括号!
否则会报错
[Error] request for member 'class里的函数' in 'class的名字', which is of non-class type 'class的原名'
19.memset(a, 0, strlen(a));可以但是memset(a, 0, sizeof(a));(未解决
![](https://img-blog.csdnimg.cn/38dc2f4832de457faaa1c363600dc80e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR5LiN5piv55uW6Iyo5q-U,size_19,color_FFFFFF,t_70,g_se,x_16)
所以判断是否为空,尽量用strlen,别用sizeof,sizeof连/0都算
memset用别的文件里strlen和sizeof都可以清空,但是这个文件只能strlen,也不知道为啥
20.插入老同时在末尾替换一个(未解决
最后叹号前面的那个是不想要的,应该是s
用含参的构造函数完全没问题