1.类与对象的强行辩解
首先在c语言中,讲到struct(结构体),他的成员只能为一些变量。
而c++可谓含有struct plus版,称之为类 (class)。他的成员类型不仅完全继承了c ,而且还可以为函数。 只不过,C.struct
里的变量在C++里成就被叫成了对象。通过实例步骤来讲解:
- 定义类
class student
{
//成员变量
};
- 创建对象
class student
{
//成员变量
};
int main ()
{
student stu;//前面可以加class,创建对象
}
- 访问类
class student
{
public: //共有的
int a;
private://私有的
int b;//成员变量
};
int main ()
{
student stu;//前面可以加class,创建对象
stu.a="TS";
stu.b="rookie";
}
1.1成员函数
定义成员函数后,在类体中声明函数,将函数的定义放在内外均可,但如果在类外定义,需要对函数名前加类名予以限定这里有用到域操作符
::
。
class student
{
void ts();//成员变量
};
class address
{
friend class student;//友元类
}
void student::ts()
{
cout <<xxxx ;
}
int main ()
{
student stu;//前面可以加class,创建对象
}
1.2访问权限
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。
在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。
在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。
友元函数(friend):使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。用法:当在类的定义中想引用其他类定义,可以将其他类提前申明
在当前类的函数前引friend void Student::show(Address *addr);
。
如果你想让一个类完全包括另一类,即可以声明友元类。 friend class Student
**注意:**友元类是单向的,且关系不能传递!
2.命名空间
当一个程序由多名程序猿共同开发,会大量使用变量和函数,没提前商量着命名的变量,很容易重复。
为了避免命名冲突的问题,C++引入命名空间(namespace)
namespace是c++的关键词,语法格式为:
namespace name //命名空间的名字,
{
//包含有变量、函数、类、typedef、#define
}
当使用变量,函数时,要指明所在命名空间,用::域解析操作符
来指出如:
student::dl=delay() //用student定义的变量dl
除了上述直接使用域解析操作符,还可以采用 using 关键字声明:
using std::dl;
一般在写一个程序的时候,我们可以在开头用using namespace std;
类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是后面出现的所有未知名命名空间的变量都用的是std
3.头文件
c语言的基本头文件
stdio.h
stdlib.h
所有头文件命名都要加后缀.h
,或者前缀c
.
c++再一次汇编,在原有的基础上,加入了iostream
fstream
,string
并将头文件的内容存储做了一个大的区分:
对于不带.h
的头文件,所有的符号都位于命名空间 std
中,使用时需要声明命名空间 std
;对于带.h
的头文件,没有使用任何命名空间,所有符号都位于全局作用域。
3.1常见头文件的使用
如你所见,大都C++程序开头会使用iostream
它包含了用于输入输出的对象,cin
表示标准输入、cout
表示标准输出:
- 使用 cout 进行输出时需要紧跟<<运算符;
- 使用 cin 进行输入时需要紧跟>>运算符。
*这两个运算符可以自行分析所处理的数据类型,因此无需像使用 scanf 和 printf 那样给出格式控制字符串。*自我认为在操作方面比c语言便利了许多,拿一段程序来做说明:
#include<iostream>
using namespace std;
int main(){
int x;
float y;
cout<<"Please input an int number and a float number:"<<endl;//可以连续输出
cin>>x>>y;//直接输入int变量
cout<<"The int number is x= "<<x<<endl;
cout<<"The float number is y= "<<y<<endl;
return 0;
}
在这里,你会发现,我在每一个 cout
语句后都添加了 endl
,这里的最后一个字符是字母“l”而不是数字“1”表示换行。当你不用换行时,就更方便了!去掉endl
,后面的 cout
可以省略。
string:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1;
string s2 = "c plus plus";
string s3 = s2;
string s4 (5, 's');
return 0;
}
变量 s1 只是定义但没有初始化,编译器会将默认值赋给 s1,默认值是"",也即空字符串。
变量 s2 在定义的同时被初始化为"c plus plus"。与C风格的字符串不同,string 的结尾没有结束标志’\0’。
变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"。
变量 s4 被初始化为由 5 个’s’字符组成的字符串,也就是"sssss"。
从上面的代码可以看出,string 变量可以直接通过赋值操作符=进行赋值。string 变量也可以用C风格的字符串进行赋值,例如,s2 是用一个字符串常量进行初始化的,而 s3 则是通过 s2 变量进行初始化的。
与C风格的字符串不同,当我们需要知道字符串长度时,可以调用 string 类提供的 length() 函数。
length() 返回的是字符串的真实长度,而不是长度 +1。
4.内存的分配与释放
在c语言中,动态分配内存用
malloc()
,释放可以用free
,在我另一篇写cuda的文章里,NVCC 采用c语言的语法。
但是,在 c++ 仍作出拓广,在原有保持的基础上,新增了new
用来分配 delete
用于释放,用哲学的角度来讲,一个新事物的产生在客观规律和前进趋势方面必定优于旧事物
- 操作简单:直接分配与释放
int *p =new int;//分配int 类型的空间
delete p;//释放内存
还阔以分配和释放一组连续的数据。只不过要在new
和 delete
后加 []
。
2. 可以自动调用构造函数和析构函数
5.inline 内联函数
用上面的例子来讲:如果在类内对成员函数进行定义就直接相当于内联函数。如果在类外定义,要想让他成为内联函数,可以在定义函数前加 inline
。
简单来讲,内联函数可以省去函数之间来回调用的时间,但函数代码比较长,调用时间可以忽略。 所以不怎么重要,简单了解读懂代码即可!
6.this指针
this 用在类的内部,只有在对象被创建以后才会给this赋值,又因为其是一个指针,所以要用->来访问成员变量。
#include <iostream>
using namespace std;
class Student{
public:
void setname(char *name);
void show();
private:
char *name;
};
void Student::setname(char *name)
{
this->name = name;
}
void Student::show()
{
cout<<"这个人是"<<this->name<<endl;
}
int main(){
Student *pstu = new Student;
pstu -> setname("李华");
pstu -> show();
return 0;
}
7.const常成员变量
当你不希望某些数据被修改,可以用 const关键字加以限定。
常成员函数需要在声明和定义的时候在函数定义的结尾加上 const 。例如此声明:char *getname() const
。
常对象