让指针指向一个常量对象,可以防止使用该指针修改所指向的值。
int age = 39; const int *pt = &age;
该声明指出,pt指向一个const int(39),因此不能用pt这个指针来修改这个值,即*pt的值为const,不能修改。
pt的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对pt而言,这个值是常量。即,可以直接通过age变量来改变age的值,但是不能通过pt指针来修改它。
*pt = 20; //不合法 age = 20; //合法
将const变量的地址赋值给常规指针(不合法),将const变量的地址赋值给指向const指针(合法)。
将指针本身声明为常量,可以防止改变指针指向的位置。
int sloth = 3; int a = 4; const int *ps = &sloth; //一个指向常量的指针 int * const finger = &sloth; //一个指向整型数据的常量指针 *ps = 4; //不合法 ps = &a; //合法 *finger = 4; //合法 finger = &a; //不合法
即,finger和*ps都是const,而 *finger和ps不是。
函数与二维数组假设有以下代码:
int data[3][4] = {{1,2,3.4},{5,6,7,8},{9,10,11,12}};
int total = sum(data,3);
则sum()的原型是什么样的?
data是一个数组名,该数组有3个元素。第一个元素本身是一个数组,由4个int型数据组成。故data的类型是指向由4个int型数据组成的数组的指针。
原型如下:
int sum(int (*ar2) [4],int size); int sum(int ar2[][4],int size);
补充小知识:
数组指针:
int (*p)[4]:p是一个指向整型数组的指针,简称数组指针,重点在于一定是个指针,数组起修饰作用
指针数组:
int *p[4]:是一个保存指针的数组
总结:当遇到复杂的考虑两点
一.优先级 () == [ ]> * 但()与[]是左结合
二.
1.若是指针(带*号),则看指向什么东西
2.若指向数组(带[]),则看长度和数据类型
3.若是函数(带小括号()),则看参数列表和访问值
数组指针的理解
数组指针,顾名思义,就是指向数组的指针。
如上图所示,假设定义 int (*p2)[5] = { 0, 0, 0, 0, 0}; 那么p2就指向了这个包含5个int类型的数组了。
( !!!注意:指向数组和指向数组首元素的地址是两码事。p2在内存中指向的是这个数组的首地址,是和数组有关联的,而绝不仅仅是指向数组首元素的地址。)
代码:
#includeint main() { int temp[5] = {1, 2, 3, 4, 5}; int (*p)[5] = &temp; int i; for(i = 0; i < 5; i++) { printf("%dn", *(*p + i)); //或者 printf("%dn", (*p)[i]); } return 0; }
1)第一行定义了含有5个int类型的数组temp;
2)第二行就定义了一个指向含有5个int类型数组的指针p,并把temp数组的首地址给了指针p。
注意:这里为什么不直接用 int (*p)[5] = temp;呢?
这是因为虽然temp和&temp的值都是相同的,但它们的意义却是不相同的:
*** temp指的是这个数组的 第一个元素 的首地址。
*** &temp 指的是这 整个数组 的首地址。
3)for循环是想把数组temp里面的数字都打出来。里面为什么用*(*p + i)呢?
p所指的是数组temp的地址,
( * p+i) 所指的是它在数组中的位置,* (*p+i)就表示相应位置上的值了
此处为转载,原文链接如下:原文
感谢博主。
What is an object?Object = EntityObject may be
– Visible or
--Invisible
Object is variable in programming languages.
Objects = Attibutes + Services
data: the properties or statusOperations : the functions
打印一个三维坐标点来体会C与C++的区别:
C里面结构体只有数据,操作是在结构体外面,需要操作时得把对象的地址传到函数里面去;而C++的类里面既有数据,也有操作,需要操作时让那个对象自己调用操作即可。 面向对象基本原理
不要直接去操作对象里面的那个“data”!!
Object VS Class
class是一个概念,object是一个实体。
OOP(Object Oriented Programming)的五大特征
1.Everything is an object.
(万物皆对象。)
2.A program is a bunch of objects telling each other what to do by sending messages.
(程序是一堆通过发送消息来告诉彼此该做什么的对象。)
what to do not how to do!
3.Each object has its own memory made up of other objects.
(每个对象都有由其他对象组成的自己的内存。)
4.Every object has a type.
(每个对象都有一个类型。)-----先有类型再有对象。
5.All objects of a paticular type can receive the same messages.
(所有特定类型的对象都可以接收相同的消息。)-----所有可以接收相同消息的对象都可以被认为是同一个类型。
对象都是以接口与外界打交道
我们都无法直接接触到对象的内部,需要通过接口(interface)才能接触到对象内部。
接口的作用
交流、通信保护
Encapsulation(封装)
bundle data and methods dealing with these data together in an object.
(将数据和处理这些数据的方法捆绑在一个对象中。)
Hide the details of the data and the action.
(隐藏数据和操作的细节。)
Restrict only access to the publicized methods.
(限制用户只能访问公开的方法。)
:: resolver(域的解析符)
< Class Name>:: < function name>
::< function name>
void S::f(){
::f(); //Would be recursive otherwise;
::a++; //Select the global a
a--; //The a at class scope
}
S::f()表明f函数是属于S的。
::f()表明f函数是一个全局的函数,于是将不断的递归调用f函数。
::a++表明使用全局变量a。
a–表明使用这个类里面的变量a。
头文件类的定义
在C++里面用.h文件和.cpp文件来定义一个类类的声明和描述(函数原型(声明)等)是写在头文件中的(.h)所有的函数体都是在.cpp文件中
头文件
如果有一个函数被声明在头文件中,那么所有需要用到这个函数或者定义这个函数的地方都需要将该头文件包含进来如果有一个类被声明在头文件中,那么所有需要用到这个类或者定义这个类的成员的地方都需要将该头文件包含进来
Header = interface
头文件是你和用你代码人之间的一种契约编译通过要求您在使用所有结构和函数之前声明它们来强化契约
C++程序的结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W1HX9br3-1648435707328)(F:Cpp_study图片Snipaste_2022-03-28_10-18-34.png)]
C++语言的编译过程(.cpp—>.i—>.s—>.o—>.out)
声明与定义
一个.cpp文件就是一个编译单元.h文件中只允许存在声明
extern变量函数原型类/结构体的声明
#include
#include是将被包含的文件插入到.cpp文件中#include的位置
语句#include " xx.h":首先在当前目录中搜索,然后是在某处声明的目录#include
.h里面放声明而不放定义,是防止多个.cpp文件包含同一个.h时,最后链接的时候出现重复定义的错误
标准头文件结构
#ifndef HEADER_FLAG #define HEADER_FLAG // Type declaration here. . . #endif // HEADER_FLAG
加上标准头文件结构是为了防止在一个.cpp包含同一个.h文件多次,而出现类声明的重复出现
Tips for header
一个头文件(xx.h)只放一个类声明,而它对应的源文件要用相同的前缀(xx.cpp),里面放相应的函数等
2.头文件的内容要用标准头文件结构包围起来
绝对不允许include一个.cpp或者.c文件



