应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

CCconst详解,拿捏住了

  序
  人生如梦,岁月如水,静好无恙。
  嗨,这里是狐狸
  时间不多,废话少说,我们直接开始。今天讲const。
  const
  为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下:
  常变量:const类型说明符变量名
  常引用:const类型说明符引用名
  常对象:类名const对象名
  常成员函数:类名::fun(形参)const
  常数组:类型说明符const数组名〔大小〕
  常指针:const类型说明符指针名,类型说明符const指针名
  首先提示的是:在常变量(const类型说明符变量名)、常引用(const类型说明符引用名)、常对象(类名const对象名)、常数组(类型说明符const数组名〔大小〕),const与类型说明符或类名(其实类名是一种自定义的类型说明符)的位置可以互换。如:
  constinta5;与intconsta5;等同
  类名const对象名与const类名对象名等同
  用法1:常量
  取代了C中的宏定义,声明时必须进行初始化(!c类中则不然)。const限制了常量的使用方式,并没有描述常量应该如何分配。如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。《CProgramLanguage》用const声明的变量虽然增加了分配空间,但是可以保证类型安全。
  C标准中,const定义的常量是全局的,C中视声明位置而定。
  用法2:指针和常量
  使用指针时涉及到两个对象:该指针本身和被它所指的对象。将一个指针的声明用const预先固定将使那个对象而不是使这个指针成为常量。要将指针本身而不是被指对象声明为常量,必须使用声明运算符const。
  所以出现在之前的const是作为基础类型的一部分:
  charconstcp;到char的const指针
  charconstpc1;到constchar的指针
  constcharpc2;到constchar的指针(后两个声明是等同的)
  从右向左读的记忆方式:
  cpisaconstpointertochar。故pc不能指向别的字符串,但可以修改其指向的字符串的内容
  pc2isapointertoconstchar。故pc2的内容不可以改变,但pc2可以指向别的字符串
  且注意:允许把非const对象的地址赋给指向const对象的指针,不允许把一个const对象的地址赋给一个普通的、非const对象的指针。
  用法3:const修饰函数传入参数
  将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。
  通常修饰指针参数和引用参数:
  voidFun(constAin);修饰指针型传入参数
  voidFun(constAin);修饰引用型传入参数
  用法4:修饰函数返回值
  可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。
  用法5:const修饰成员函数(c特性)
  const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数;
  const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;
  const成员函数不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。
  具体展开来讲:
  (一)。常量与指针
  常量与指针放在一起很容易让人迷糊。对于常量指针和指针常量也不是所有的学习CC的人都能说清除。例如:
  constintm1newint(10);
  intconstm2newint(20);
  在上面的两个表达式中,最容易让人迷惑的是const到底是修饰指针还是指针指向的内存区域?其实,只要知道:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用。根据这个规则来判断,m1应该是常量指针(即,不能通过m1来修改它所指向的内容。);而m2应该是指针常量(即,不能让m2指向其他的内存模块)。由此可见:
  1。对于常量指针,不能通过该指针来改变所指的内容。即,下面的操作是错误的:
  inti10;constintpii;pi100;
  因为你在试图通过pi改变它所指向的内容。但是,并不是说该内存块中的内容不能被修改。我们仍然可以通过其他方式去修改其中的值。例如:
  1:通过i直接修改。i100;2:使用另外一个指针来修改。intp(int)pi;p100;
  实际上,在将程序载入内存的时候,会有专门的一块内存区域来存放常量。但是,上面的i本身不是常量,是存放在栈或者堆中的。我们仍然可以修改它的值。而pi不能修改指向的值应该说是编译器的一个限制。
  2。根据上面const的规则,constintm1newint(10);我们也可写作:
  intconstm1newint(10);
  这是,理由就不须作过多说明了。
  3。在函数参数中指针常量时表示不允许将该指针指向其他内容。
  voidfunc02(intconstp){intpinewint(100);错误!P是指针常量。不能对它赋值。ppi;}intmain(){intpnewint(10);func02(p);deletep;return0;}
  4。在函数参数中使用常量指针时表示在函数中不能改变指针所指向的内容
  voidfunc(constintpi){错误!不能通过pi去改变pi所指向的内容!pi100;}intmain(){intpnewint(10);func(p);deletep;return0;}
  我们可以使用这样的方法来防止函数调用者改变参数的值。但是,这样的限制是有限的,作为参数调用者,我们也不要试图去改变参数中的值。因此,下面的操作是在语法上是正确的,但是可能破还参数的值:
  includeiostreamincludestringvoidfunc(constintpi){这里相当于重新构建了一个指针,指向相同的内存区域。当然就可以通过该指针修改内存中的值了。intpp(int)pi;pp100;}intmain(){usingnamespacestd;intpnewint(10);coutppendl;func(p);coutppendl;deletep;return0;}
  (二):常量与引用
  常量与引用的关系稍微简单一点。因为引用就是另一个变量的别名,它本身就是一个常量。也就是说不能再让一个引用成为另外一个变量的别名,那么他们只剩下代表的内存区域是否可变。即:
  inti10;正确:表示不能通过该引用去修改对应的内存的内容。constintrii;错误!不能这样写。intconstrcii;
  由此可见,如果我们不希望函数的调用者改变参数的值。最可靠的方法应该是使用引用。下面的操作会存在编译错误:
  voidfunc(constinti){错误!不能通过i去改变它所代表的内存区域。i100;}intmain(){inti10;func(i);return0;}
  这里已经明白了常量与指针以及常量与引用的关系。但是,有必要深入的说明以下。在系统加载程序的时候,系统会将内存分为4个区域:堆区栈区全局区(静态)和代码区。从这里可以看出,对于常量来说,系统没有划定专门的区域来保护其中的数据不能被更改。也就是说,使用常量的方式对数据进行保护是通过编译器作语法限制来实现的。我们仍然可以绕过编译器的限制去修改被定义为常量的内存区域。看下面的代码:
  constinti10;这里i已经被定义为常量,但是我们仍然可以通过另外的方式去修改它的值。这说明把i定义为常量,实际上是防止通过i去修改所代表的内存。intpi(int)i;
  (三):常量函数
  常量函数是C对常量的一个扩展,它很好的确保了C中类的封装性。在C中,为了防止类的数据成员被非法访问,将类的成员函数分成了两类,一类是常量成员函数(也被称为观察着);另一类是非常量成员函数(也被成为变异者)。在一个函数的签名后面加上关键字const后该函数就成了常量函数。对于常量函数,最关键的不同是编译器不允许其修改类的数据成员。例如:
  classTest{public:voidfunc()const;private:intintValue;};voidTest::func()const{intValue100;}
  上面的代码中,常量函数func函数内试图去改变数据成员intValue的值,因此将在编译的时候引发异常。
  当然,对于非常量的成员函数,我们可以根据需要读取或修改数据成员的值。但是,这要依赖调用函数的对象是否是常量。通常,如果我们把一个类定义为常量,我们的本意是希望他的状态(数据成员)不会被改变。那么,如果一个常量的对象调用它的非常量函数会产生什么后果呢?看下面的代码:
  classFred{public:voidinspect()const;voidmutate();};voidUserCode(Fredchangeable,constFredunChangeable){changeable。inspect();正确,非常量对象可以调用常量函数。changeable。mutate();正确,非常量对象也允许修改调用非常量成员函数修改数据成员。unChangeable。inspect();正确,常量对象只能调用常理函数。因为不希望修改对象状态。unChangeable。mutate();错误!常量对象的状态不能被修改,而非常量函数存在修改对象状态的可能}
  从上面的代码可以看出,由于常量对象的状态不允许被修改,因此,通过常量对象调用非常量函数时将会产生语法错误。实际上,我们知道每个成员函数都有一个隐含的指向对象本身的this指针。而常量函数则包含一个this的常量指针。如下:
  voidinspect(constFredthis)const;
  voidmutate(Fredthis);
  也就是说对于常量函数,我们不能通过this指针去修改对象对应的内存块。但是,在上面我们已经知道,这仅仅是编译器的限制,我们仍然可以绕过编译器的限制,去改变对象的状态。看下面的代码:
  classFred{public:voidinspect()const;private:intintValue;};voidFred::inspect()const{coutAtthebeginning。intValueintValueendl;这里,我们根据this指针重新定义了一个指向同一块内存地址的指针。通过这个新定义的指针,我们仍然可以修改对象的状态。FredpFred(Fred)this;pFredintValue50;coutFred::inspect()called。intValueintValueendl;}intmain(){Fredfred;fred。inspect();return0;}
  上面的代码说明,只要我们愿意,我们还是可以通过常量函数修改对象的状态。同理,对于常量对象,我们也可以构造另外一个指向同一块内存的指针去修改它的状态。这里就不作过多描述了。
  另外,也有这样的情况,虽然我们可以绕过编译器的错误去修改类的数据成员。但是C也允许我们在数据成员的定义前面加上mutable,以允许该成员可以在常量函数中被修改。例如:
  classFred{public:voidinspect()const;private:mutableintintValue;};voidFred::inspect()const{intValue100;}但是,并不是所有的编译器都支持mutable关键字。这个时候我们上面的歪门邪道就有用了。关于常量函数,还有一个问题是重载。includeiostreamincludestringusingnamespacestd;classFred{public:voidfunc()const;voidfunc();};voidFred::func()const{coutconstfunctioniscalled。endl;}voidFred::func(){coutnonconstfunctioniscalled。endl;}voidUserCode(Fredfred,constFredcFred){coutfredisnonconstobject,andtheresultoffred。func()is:endl;fred。func();coutcFredisconstobject,andtheresultofcFred。func()is:endl;cFred。func();}intmain(){Fredfred;UserCode(fred,fred);return0;}输出结果为:fredisnonconstobject,andtheresultoffred。func()is:nonconstfunctioniscalled。cFredisconstobject,andtheresultofcFred。func()is:constfunctioniscalled。
  从上面的输出结果,我们可以看出。当存在同名同参数和返回值的常量函数和非常量函数时,具体调用哪个函数是根据调用对象是常量对像还是非常量对象来决定的。常量对象调用常量成员;非常量对象调用非常量的成员。
  总之,我们需要明白常量函数是为了最大程度的保证对象的安全。通过使用常量函数,我们可以只允许必要的操作去改变对象的状态,从而防止误操作对对象状态的破坏。但是,就像上面看见的一样,这样的保护其实是有限的。关键还是在于我们开发人员要严格的遵守使用规则。另外需要注意的是常量对象不允许调用非常量的函数。这样的规定虽然很武断,但如果我们都根据原则去编写或使用类的话这样的规定也就完全可以理解了。
  (四):常量返回值
  很多时候,我们的函数中会返回一个地址或者引用。调用这得到这个返回的地址或者引用后就可以修改所指向或者代表的对象。这个时候如果我们不希望这个函数的调用这修改这个返回的内容,就应该返回一个常量。这应该很好理解,大家可以去试试。
  c中const
  1。const常量
  如constintmax100;
  优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)
  2。const修饰类的数据成员
  如:
  classA
  {
  constintsize;
  }
  const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const数据成员的值是什么。如
  classA
  {
  constintsize100;错误
  intarray〔size〕;错误,未知的size
  }
  const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现。如
  classA
  {
  enum{size1100,size2200};
  intarray1〔size1〕;
  intarray2〔size2〕;
  }
  枚举常量不会占用对象的存储空间,他们在编译时被全部求值。但是枚举常量的隐含数据类型是整数,其最大值有限,且不能表示浮点数。
  3。const修饰指针的情况
  见下式:
  intb500;
  constinta〔1〕
  intconsta〔2〕
  intconsta〔3〕
  constintconsta〔4〕
  如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《Effectivec》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,〔1〕和〔2〕的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能a3;〔3〕为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a是错误的;〔4〕为指针本身和指向的内容均为常量。
  4。const的初始化
  先看一下const变量初始化的情况
  1)非指针const常量初始化的情况:
  Ab;
  constAab;
  2)指针const常量初始化的情况:
  AdnewA();
  constAcd;
  或者:constAcnewA();
  3)引用const常量初始化的情况:
  Af;
  constAef;这样作e只能访问声明为const的函数,而不能访问一般的成员函数;
  〔思考1〕:以下的这种赋值方法正确吗?
  constAcnewA();
  Aec;
  〔思考2〕:以下的这种赋值方法正确吗?
  AconstcnewA();
  Abc;
  5。另外const的一些强大的功能在于它在函数声明中的应用
  在一个函数声明中,const可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:
  Aoperator(constAa);
  voidfun0(constAa);
  voidfun1()const;fun1()为类成员函数
  constAfun2();
  1)修饰参数的const
  如:voidfun0(constAa);voidfun1(constAa);
  调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为constAa,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为constAa,则不能对传递进来的引用对象进行改变,保护了原对象的属性。
  〔注意〕:参数const通常用于参数为指针或引用的情况,且只能修饰输入参数;若输入参数采用值传递方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。
  〔总结〕
  对于非内部数据类型的输入参数,因该将值传递的方式改为const引用传递,目的是为了提高效率。例如,将voidFunc(Aa)改为voidFunc(constAa)
  对于内部数据类型的输入参数,不要将值传递的方式改为const引用传递。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(intx)不应该改为voidFunc(constintx)
  2)修饰返回值的const
  如:constAfun2();constAfun3();
  这样声明了返回值后,const按照修饰原则进行修饰,起到相应的保护作用
  constRationaloperator(constRationallhs,constRationalrhs)
  {
  returnRational(lhs。numerator()rhs。numerator(),
  lhs。denominator()rhs。denominator());
  }
  返回值用const修饰可以防止允许这样的操作发生:Rationala,b;
  Radionalc;
  (ab)c;
  一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的时候。
  〔总结〕
  1。一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因如下:如果返回值为某个对象为const(constAtestA实例)或某个对象的引用为const(constAtestA实例),则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。
  2。如果给采用指针传递方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。如:
  constcharGetString(void);
  如下语句将出现编译错误:
  charstrGetString();
  正确的用法是:
  constcharstrGetString();
  3。函数返回值采用引用传递的场合不多,这种方式一般只出现在类的赙值函数中,目的是为了实现链式表达。如:
  classA{Aoperate(constAother);负值函数}Aa,b,c;a,b,c为A的对象abc;正常(ab)c;不正常,但是合法若负值函数的返回值加const修饰,那么该返回值的内容不允许修改,上例中abc依然正确。(ab)c就不正确了。
  6。类成员函数中const的使用
  一般放在函数体后,形如:voidfun()const;
  任何不会修改数据成员的函数都因该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。如:
  classStack{public:voidPush(intelem);intPop(void);intGetCount(void)const;const成员函数private:intmnum;intmdata〔100〕;};intStack::GetCount(void)const{mnum;编译错误,企图修改数据成员mnumPop();编译错误,企图调用非const函数Returnmnum;}
  7。使用const的一些建议
  1)要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
  2)要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
  3)在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
  4)const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
  5)不要轻易的将函数的返回值类型定为const;
  6)除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
  〔思考题答案〕
  1)这种方法不正确,因为声明指针的目的是为了对其指向的内容进行改变,而声明的指针e指向的是一个常量,所以不正确;
  2)这种方法正确,因为声明指针所指向的内容可变;
  3)这种做法不正确;
  在constA::operator(constAa)中,参数列表中的const的用法正确,而当这样连续赋值的时侯,问题就出现了:
  Aa,b,c:
  (ab)c;
  因为a。operator(b)的返回值是对a的const引用,不能再将c赋值给const常量。
  const在c和c中的区别
  1。C中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中。所以,以下代码:
  usingnamespacestd;intmain(){constinta1;constintb2;intarray〔ab〕{0};for(inti0;isizeofarraysizeofarray;i){coutarrayendl;}}在可以通过编译,并且正常运行。但稍加修改后,放在C编译器中,便会出现错误:intmain(){inti;constinta1;constintb2;intarray〔ab〕{0};for(i0;isizeofarraysizeofarray;i){printf(d,array);}}
  错误消息:
  c:est1e。c(8):errorC2057:应输入常数表达式
  c:est1e。c(8):errorC2466:不能分配常数大小为0的数组
  出现这种情况的原因是:在C中,const是一个不能被改变的普通变量,既然是变量,就要占用存储空间,所以编译器不知道编译时的值。而且,数组定义时的下标必须为常量。
  2。在C语言中:constintsize;这个语句是正确的,因为它被C编译器看作一个声明,指明在别的地方分配存储空间。但在C中这样写是不正确的。C中const默认是内部连接,如果想在C中达到以上的效果,必须要用extern关键字。即C中,const默认使用内部连接。而C中使用外部连接。
  (1)内连接:编译器只对正被编译的文件创建存储空间,别的文件可以使用相同的表示符或全局变量。CC中内连接使用static关键字指定。
  (2)外连接:所有被编译过的文件创建一片单独存储空间。一旦空间被创建,连接器必须解决对这片存储空间的引用。全局变量和函数使用外部连接。通过extern关键字声明,可以从其他文件访问相应的变量和函数。
  总结
  希望这篇文章可以给予大家一定的帮助,也感谢大家的支持,后续我还会发布更多的项目源或者学习资料,希望大家可以持续关注,有什么问题可以回帖留言。领取CC学习资料以及其他项目的源码的可以加群【1083227756】了解。想要对程序员的未来发展有兴趣的可以关注微信公众号:【狐狸的编码时光】,希望和大家一起学习进步!

德约科维奇麻烦了!纳达尔提前锁定法网冠军?名将他太强大了12月27日,29岁的阿根廷网球名将、现世界排名第13的好手施瓦茨曼在接受采访时提到了他眼中的纳达尔和费德勒,在他看来,红土场上的纳达尔几乎是不可战胜的,而且对对手施压的精神压……沈梦辰预热婚礼说领证没有仪式感?杜海涛大概率带她跳槽芒果竞品八卦手册近日,沈梦辰在综艺《中国婚礼》在线还原自己的领证现场!匆匆忙忙签字,匆匆忙忙拍照,匆匆忙忙结束和自己想象中充满仪式感的领证现场完全不同!沈梦辰这是要给自己婚礼预热……葡萄牙阿尔加维那些天涯海角的事机缘这件事总是很奇妙。不曾想到,会在第一次到达的陌生国度葡萄牙住下来已经两年多。中南部的阿连特茹(Alentejo)大区,满眼是望不见尽头的田野起伏,这里有着世界最大面积的栓皮……故地重游?天空体育铁锤帮提出正式报价欲免签林皇据天空体育报道,林加德有望以自由球员的身份重返西汉姆联,他已经收到了球队开出的正式报价。在上一季英超结束之后,林加德没有与曼联续约,即将恢复自由身。天空体育表示,西汉姆联……第一次饮酒,初相见里的桃夭你说,你想喝酒了原因无他只是因为期末考试考砸了我说,好办于是拉着你一起去了离学校不远处的小酒馆名字为初相见我们调侃着这略带俗气和矫情的名字……被导演娶走的10位女星,个个沉鱼落雁,闭月羞花,导演赚了赚了在娱乐圈中,女演员和导演在拍戏的过程中产生感情是再正常不过的事,而不少女星在年纪大了之后,也会选择嫁给导演,一个拍,一个演,是不少人心中的才子佳人。而导演的审美自然也是不……天热不妨多吃这八道菜,荤素搭配开胃下饭香,炒一炒5分钟能出锅进入六月后,天气实在是太热了,人的食欲开始下降,家人的胃口也变得很差,但是不吃饭,人也没有精神和体力去学习和工作,因此要注意及时补充营养。夏天太热没胃口,试试这几道菜,荤素搭配……在乌克兰100元能享受哪些服务?当地人说出实情,男游客心动了100元人民币在乌克兰能享受哪些服务?(此处已添加小程序,请到今日头条客户端查看)乌克兰美女说出实情后,中国小伙心动不已。这几年,越来越多国民开始体验出国旅游的乐趣……这座天文台最大的望远镜,带你走进天文学先辈们的世界在加利福尼亚州南部,有一座名叫帕洛玛的山。1936年,在这座山上,那里的人们亲眼目睹了伟大的工程师和工人们利用500多吨钢材和玻璃打造了举世瞩目的帕洛玛天文台上的海耳望远……第396堂好课凯文凯利成为创造者他是硅谷著名的预言家,也常被看作是网络文化的发言人和观察者。他曾经创下一个词预测未来100年的盛举,著作被无数互联网大佬奉为互联网商业圣经。他就是凯文凯利(Kevi……惠威MT1Mini蓝牙音箱体验有能力刷爆社交平台的家居好物现如今,谁家还没个蓝牙音箱啊,特别这两年大家宅家时间增加,在家娱乐需求多起来了,怎么着也会入手个蓝牙音箱,让美妙的声音充满整个空间,为心灵带来一些快乐和慰藉。只是无论已经入手与……提醒生活中常见的这五个野菜,或要少吃,建议别再当成宝从古至今人们更喜欢吃一些野味,比如飞禽走兽的肉或者是田地里植物的根茎,大多数人都认为这种食物富含营养价值丰富,要比平常的蔬菜与肉食口味更好尤其是在春夏季节,漫山遍野的农田……
宋丹丹祖孙三代同框笑开花,儿媳住20万月子中心,产后恢复状态生活中最大的幸福是知道有人爱我雨果最好的爱情是:你在闹,我在笑。有人说婚姻是爱情的坟墓,里面的人想出来,外面的人又总想进去看看!其实婚姻生活过得好与不好,完全取决于……暗示联手库里,詹姆斯明面算账!抛售维金斯,勇士也拒绝亏本买卖输给太阳之后,湖人彻底结束了本赛季。这个戏剧性的赛季,最终以无缘季后赛收尾,多少会令人唏嘘。要知道,在赛季开始之前,湖人的夺冠赔率仅次于布鲁克林篮网,这个反差属实有点离谱。关于……社会不允许女人太天真社会不允许女人太天真,从学校走向社会以后,你会发现,有很多我们看不惯的事,有很多荒唐的事,也有很多自己引以为傲的准绳,却别别人耻笑,这一切都是因为在学校你学习了很多生存的技能,……大S又怀孕了?台媒称她已怀孕2个月,网友这是不要命了吗?爱情是真实的,是我们所知道的最甜也是最苦的东西。夏洛蒂勃朗特坠入爱河是一件幸福的事情,然而身陷爱情之人既有甜蜜幸福的滋润却也免不了要尝一些苦。今年来闹得沸沸扬扬的大……季后赛篮下得分惊人减少的背后,隐含着什么?季后赛篮下得分惊人减少的背后,隐含着什么?注:原文刊发于美国时间6月13日东部半决赛的G7,波士顿开场的战术有些懒洋洋。控卫马库斯斯马特运球过半场,艾尔霍福德向着左……猫鼠争霸之借刀杀人鼠国破坏结盟打败猫王夺取黄金岛分割黄金可恶的小老鼠让我们损失惨重,这个仇一定要报对大王,我们一定要好好教训这些可恶的小老鼠。可是在关键的时候,狗国总是帮助鼠国攻打我们,可得好好想办法,不让狗国王帮助老鼠,有什么好办……阿德巴约谈对塔图姆致命封盖我每年纪念日都发这张照片给他直播吧4月8日讯2020年季后赛东部决赛G1,热火加时战胜凯尔特人。比赛最后时刻,阿德巴约封盖了塔图姆的绝平扣篮。最终热火拿下系列赛闯进总决赛。近日,阿德巴约在一档播客中……等到了!华为Mate50七月发布微曲屏麒麟9000系列,还有近期多家手机厂商都开始预热自家新品,而大家关注已久的华为Mate50系列也在近期曝光了更多核心信息。一起来看下吧。对于华为Mate50的外观设计,此前有不少网友评价希望能……想延缓衰老,保养的黄金期别错过,夜间3件事要做好保养自己要在睡觉之前,身体和肌肤的排毒都是在晚上进行的,所以要在睡觉之前做好保养工作,然后让身体自行消耗和分解,在吸收和运作,这个时间段是保养的黄金期,因为夜间身体是要消耗一天……中国女排2022年世界女排联赛第二周赛事结束及第三周赛程随着巴西巴西利亚站的比赛结束,2022年世界女排联赛第二周的比赛全部结束。第二周比赛成绩及最终排名如下:第2周第3组地点:巴西巴西利亚下表采用巴西利亚时间(UTC03:00……U18亚锦赛中国女排3比1逆转韩国,晋级决赛,第三局25比1北京时间6月12日消息,2022年U18女排亚锦赛在泰国佛统府展开半决赛较量,叶文挂帅的中国女排以3比1逆转韩国女排,晋级决赛,将与日本与泰国之间的胜者争夺冠军。第三局,中国女……向C罗看齐!麦克托米奈休假疯狂加练,秀出一身肌肉直播吧6月25日讯努力总会有回报!在休赛期,与友人一起度假的麦克托米奈也不忘了加练。一直泡在健身房的小麦获得了回报,在社媒晒出的照片中,他写道:深夜工作,肌肉线条已经越发明显。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网