(4)风色从零单排《C++ Primer》 变量,引用,指针

从零单排《C++ Primer》

——(4)变量,引用,指针  

变量的初始化

所谓变量的初始化,指在创建变量的同时给予值。

初始化方法:

int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold{0};

long double ld = 3.1415926536;
int a{ld}, b = {ld}; //error:narrowing conversion required
int c(ld), d = ld;// ok:but value will be truncated

默认初始化:

当我们定义一个变量却不对其初始化的时候,变量将被默认初始化。一般来说,在函数外定义的基本类型变量,默认的初始化值是0。在函数内则是undefined。而对于类结构,一般由类内部定义。

Exercise 2.9: Explain the following definitions. For those that are illegal, explain what's wrong and how to correct it.
    std::cin >> int input_value; //error
    int i = {3.14};              //error double to int
    double salary = wage = 999.99; //error wage未定义
    int i = 3.14;                  //ok
Exercise 2.10: What are the initial values, if any, of each of the following variables?
std::string global_str;//empty
int global_int; //0
int main(int argc, const char * argv[]) {
    int local_int;//uninitialized
    std::string local_str;//empty
    std::cout << local_str <<std::endl;
    return 0;
}

声明和定义

在C++中,声明和定义是有区分的。定义也是一种声明,在声明的同时为变量分配内存和赋值。同一名称定义只能一次,但声明可以多次。C++支持分开编译。在不同的文件中可能需要同一个变量,这时就需要使用到声明。

要声明但不定义,使用关键字extern。

extern int i;// declares but does not define i
int j;          //  deckares and defines j
extern double pi = 3.1416;  //definition 这时extern会被覆盖掉
Exercise 2.11:Explain whether each of the following is a declaration or a definition:
(a) extern int ix = 1024; // definition
(b) int iy;            // definition
(c) extern int iz; //declaration

标识符

可以用字母,数字或下划线。但必须由字母或下划线开始。大小写敏感。

变量命名规范

1)起名应该要有意义的

2)通常是小写字母

3)类名首字母一般大写

4)多个单词时应该容易区分,如student_loan or studentLoan

变量名作用范围

Exercise 2.13: what's the value of j in the following program?
int i = 42;
int main()
{
	int i = 100;
	int j = i;  //100
}
int i = 100, sum = 0;
    for(int i=0; i!=10; i++)
        sum += i;
    std::cout<< i << " " << sum << std::endl;// 100 45

复合类型

引用:

引用时一个对象的另外一个名字。引用必须要初始化。引用不能重新引用不同的对象,引用不是一个Object。

Exercise 2.15 Which of the following definitions,if any,are invalid?Why?

 int ival = 1.01;
 int &rval1 = 1.01; //error int-double
 int &raval2 = ival;
 int &rval3; //error must be initialized
Exercise 2.16:Which, if any, of the following assignments are invalid? If they are valid, explain what they do.
int i = 0, &r1 = i; double d = 0, &r2 = d;
 r2 = 3.14159;  //valid
 r2 = r1;       //valid
 i = r2;        //valid
 r1 = d;        //valid
Exercise 2.17: waht does the following code print?
int i, &ri = i;
i = 5; ri = 10;
std::cout<< i << " " << ri << std::endl; // 10 10

指针:

当一个指针指向一个对象时,可以用简介操作符(*)访问对象。

int i = 42;
int &r = i; //&follows a type and is part of a declaration; r is a reference
int *p;     //*follows a type and is part of a declaration;p is a pointer
p = &i;     //& is used in an expression as the address-of operator
*p = i;     //* is used in an expression as the dereference operator
int &r2 = *p; //& is part of the declaration; * is the dereference operator

空指针的三种方式:

int *p = nullptr // equivalent to int *p1 = 0;
int *p2 = 0;
//must #include cstdlib
int *p3 = NULL; // equivalent to int *p3 = 0;

把int变量赋值给指针时非法的。

int zero = 0;
pi = zero; //error:cannot assign an int to a pointer

注意:应该把所有指针都初始化!如果没有指针绑定的对象,也应该赋为nullptr或者0。

指针的其他操作

1)作为条件

int ival = 1024;
int *pi = 0;
int *pi2 = &ival;
if(pi) // pi has value 0,so condition evaluates as false
    //...
if(pi2)// pi2 points to ival,so it is not 0; the condition evaluates as true
    //...

2)void* Pointers

void* 是一种特殊的指针类型,可以保存任何类型的对象地址。

void*指针仅仅用来和其他指针作比较,或者作为函数的返回值,或者赋值给其他类型的void*指针。

Exercise 2.20:
int i = 42;
int *pi = &i;
*pi = *pi * *pi;
// i is evaluates to 1764
Exercise 2.21: Explain each of the following definitions.Indicate whether any are illegal and, if so,why.

int i = 42;
(a)double *dp = &i;//error
(b)int *ip = i;//error
(c)int *p = &i;//ok

Exercise 2.23: Given a pointerp, can you determine whetherp points to a valid object? If so, how? If not, why not?

No, you can‘t. Why? Because it would be expensive to maintain meta data about what constitutes a valid pointer and what doesn‘t, and in C++ you don‘t pay for what you don‘t want.

And you don‘t want to check whether a pointer is valid, because you know where a pointer comes from, either because
it‘s a private part of your code that you control, or because you specified it in your external-facing contracts.

指针到指针:

int ival = 1024;
int *pi = &ival;
int **ppi = &pi// ppi points to a pointer to an int

cout << "The value of ival\n"
       << "direct value: " << ival << "\n"
       <<"indirect value: ">> *pi << "\n"
       <<"double indirect value: " << **pi
       <<endl;

引用到指针:

int i = 42;
int *p;
int *&r = p;// r is a reference to the pointer p
r = &i;
*r = 0;
时间: 2024-10-09 19:45:42

(4)风色从零单排《C++ Primer》 变量,引用,指针的相关文章

从零单排c++ primer(17)

(1)假设一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义. (2)派生类的成员将隐藏同名的基类成员. (3)除了覆盖继承而来的虚函数之外,派生类最好不要重用其它定义在基类中的名字. (4)声明在内层作用域的函数并不会重载声明在外层作用域的函数.定义在派生类中的函数也不会重载其基类中的成员. (5)基类函数的每一个实例在派生类中都必须是可訪问.对派生类没有又一次定义的重载版本号的訪问实际上是对using声明点的訪问. (6)继承关系对基类拷贝控制最直接的

(1)风色从零单排《C++ Primer》 一个简单的c++程序

从零单排<C++ Primer> --(1)一个简单的c++程序 本次学习收获 0.写在前面 风色以前上过C++的课程,然而当时并没有认真去学,基本不能使用c++来作项目开发. 这次又一次学习c++,首先会阅读c++Prime英文版第五版,希望能够为以后的学习打下坚实的基础. 1.程序 一个简单的c++程序(P17),帮助我们高速了解c++的代码风格,并通过分析代码学习c++ 程序意图:在终端上输入一组数字.输出不同数字输出的次数.同样的数字必须是连续的. 如果输入: 42 42 42 42

(3)风色从零单排《C++ Primer》 重要的基本类型

从零单排<C++ Primer> --(3)重要的基本类型    算数类型(Arithmetic Types) c++算数类型 Type Meaning Minimum Size bool boolean NA char character 8 bits wchar_t wide character 16 bits char16_t Unicode character 16 bits char32_t Unicode character 32 bits short short integer

Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D

游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同对应的动画就是clip,每个运动都是一段单独的动画,使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画. animation.Play("name"); animation.CrossFade("name"); 下面的是它的几个属性 Animation:默认的动画片段: Aniamtions:包含的动画片段: Play Automaticall

PHP从零单排(十四)数据分页显示的原理及实现

分页显示是WEB编程中最频繁处理的环节之一.所谓分页显示,就是通过程序将结果集一段一段的来显示.实现分页显示,需要两个初始参数:每页显示多少记录和当前是第几页.再加上完整的结果集,就可以实现数据的分页显示.至于其他功能,比如上一页.下一页等均可以根据以上信息加以处理得到. 要取得某表中的前10条记录,可以使用如下SQL语句: SELECT * FROM a_table LIMIT 0,10 要查找第11到第20条记录,使用的SQL语句如下所示: SELECT * FROM a_table LIM

PHP从零单排(十三)使用PHP显示MySQL数据库的数据

1.在PHP执行SQL语句 要从数据库获得数据,首先PHP要执行一条对表操作的SQL语句,包括SELECT.INSERT.UPDATE或DELETE语句.一般情况下,在PHP中执行SELECT语句,会从表中查找出一些记录行.而执行其他语句,只会返回语句是否执行成功的信息. <?php $host='localhost'; $user_name='root'; $password='helloworld'; $conn=mysql_connect($host,$user_name,$passwor

单例模式----从零单排

单例模式: 保证一个类只有一个实例, 并提供一个全局访问点.(可以说是最简单的模式, 从零单排冲天梯) 类图: 抽象实现: 1. 懒汉模式 (懒得判断是否已经实例化, 先进行实例化) package com.wenniuwuren.singleton; public class Singleton { // 懒汉模式 /** * 私有且唯一的属性 */ private static Singleton uniqueInstance = new Singleton(); /** * 私有构造器保证

Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

提要 此篇是一个国外教程的翻译,虽然有点老,但是适合新手入门.自己去写代码,debug,布置场景,可以收获到很多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一篇中,我们学会了怎么在Unity中搭建游戏的场景,并且设置模型的物理属性. 在第二篇中,我们学会了怎么在unity中使用脚本,并且创建了大部分的游戏逻辑,包括投球和得分! 在这最后一节中,我们将会为用户创建一个菜单系统,并且和GameController进行交互,我们开始吧. 在设备上测试 到目前为止,

从零单排之玩转Python安全编程(II)

转自:http://www.secpulse.com/archives/35893.html 都说Python大法好,作为一名合格的安全从业人员,不会几门脚本语言都不好意思说自己是从事安全行业的. 而Python是最容易入门且使用最顺手的脚本语言,为了不引起程序员世界大战,我们不说Python是世界上最好的语言,没有之一. 这是<从零单排之玩转Python安全编程>的第二篇.第一篇参见安全脉搏<从零单排之玩转Python安全编程(I)> 本教程继续展示一些基本的Python脚本概念